#Summary (National): According to the Wage and Hour Compliance Action
data, Texas has the highest number of wage theft cases, with 45,983
individual cases, while Florida has the highest total number of
violations, with 1,185,054 violations across 29,046 cases. When adjusted
for population, West Virginia has the highest number of wage theft cases
per 10,000 people, with 20 cases per 10,000 residents. Missouri ranks
18th on this list, with around 13 cases per 10,000 people. In terms of
violations per 10,000 people, Arkansas ranks first with 2,910
violations, while Missouri ranks 46th, with 212 violations per 10,000
people. Among companies, Subway has the most wage theft cases filed
against it, totaling 1,359 cases. Wells Fargo has the highest number of
violations, with 530,002 violations—although all from a single case.
Walmart has the highest average number of affected employees per case,
with 104 cases across all states and an average of 848 employees
affected per case, totaling 88,278 workers. Dollar General had the
highest average number of violations per case. The company was involved
in 84 cases with a total of 141,139 violations, which means it committed
about 1,680 violations per case on average. The Puerto Rico Department
of Corrections was required to pay the highest amount in back
wages—$39,950,933.10. Industry-wise, the restaurant and hotel industry
has the highest total number of wage theft violations. However, in terms
of average violations per case, Health and Personal Care Stores rank
highest, with about 3,710 violations per case. Over the last 10 years,
both the number of wage theft cases and violations have declined,
suggesting possible improvement—especially with the enforcement of laws
like the Family and Medical Leave Act (FMLA) and child labor
protections.
#Project idea: Tracking Wage Theft in America #Details: Create a
interactive portal where people explore decade-long trends in wage theft
by state, industry, employer and all other related information.
#Story idea: #1: Wage theft cases are going down—but why? An analysis
of why wage theft is happening less often now and if that’s really a
good sign. #2:Workers in Health and Personal Care Stores faces the most
wage theft. Why and how people in the Health and Personal Care Stores
are the most likely to be affected by wage theft. #3: Why West Virginia
and Arkansas have the most wage theft in per 10,000 population? An
investigative look at why these two states have more wage theft than
others. #4. Why does Rhode Island take the longest time to conclude a
wage theft case? Explore the reasons behind Rhode Island’s unusually
long average case duration for resolving wage theft.
#Summary (Missouri): In Missouri, George’s Processing, Incorporated
had the highest number of Wage & Hour Compliance violations, with
3,148 violations across 2 cases. The company also paid the highest
amount in back wages—$1,245,257.09—to 3,084 employees. It affected the
most workers in the state, with a total of 3,147 employees impacted.
However, since businesses vary in size, comparing total numbers alone
may not provide a complete picture. When looking at the average number
of violations per case, the results differ—Imo’s Pizza had the highest
average, with about 23 violations per case. Missouri Vegetable Farm paid
the highest civil money penalties, totaling $384,626.61. The city of
St. Louis recorded the highest number of cases, violations, and affected
employees in Missouri, with 1,487 cases, 25,019 violations, and 21,956
affected employees, respectively. Over the past 10 years, Missouri has
seen a decline in wage and hour violations, with cases dropping from 318
in 2020 to just 6 in 2024. The average time to resolve a Wage & Hour
Compliance case in Missouri is 589 days, while the median time is 728
days—about two years. One case, involving Blue Springs Lawn &
Garden, took 4,840 days—more than 13 years—to complete.
#Story idea: #1: Missouri’s declining wage theft trends Analyzing the
decline in wage theft violations in Missouri over the last decade, from
318 cases in 2020 to just 6 in 2024. What’s driving this positive trend,
and what’s still being missed? #2. Wage theft in Saint Louis the highest
violations in Missouri” A focus on Saint Louis, which recorded 1,487
cases and 25,019 violations. This story would explore the impact on
workers and what is being done to address the problem. #3. Why did the
wage theft case against Blue Springs Lawn & Garden in Blue Springs,
Missouri, take more than 13 years to complete? Investigate the the
unusually long duration to complete the case.
#Load library
library(tidyverse)
── Attaching core tidyverse packages ───────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
#Load data #Process: I imported the data with the name “wage_theft”
using the “read_csv” code.
wage_theft <- read_csv("data/whd_whisard.csv")
Rows: 357269 Columns: 110
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (8): trade_nm, legal_name, street_addr_1_txt, cty_nm, st_cd, naic_cd, naics_code_description, flsa_repeat_violator
dbl (99): case_id, zip_cd, case_violtn_cnt, cmp_assd, ee_violtd_cnt, bw_atp_amt, ee_atp_cmt, flsa_violtn_cnt, flsa_bw_atp_amt, flsa_ee_a...
date (3): findings_start_date, findings_end_date, ld_dt
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Data assesment: #Get to know the data/ Data dictionary: 1. How many
rows? #Answer: 357,269 rows
What is one row?- #Answer: Each row represents a single,
concluded compliance action (investigation or case) conducted by the
Department of Labor at a specific employer.
How many column?- #Answer: Initially, the dataset contained 110
columns. However, several columns contained only zero values and no
meaningful data, so I excluded those. After removing these columns, the
number of columns was reduced to 94. Next, I extracted the
‘finding_start_date’ column into separate columns for Date, Month, and
Year to enable more detailed time-based analysis. This transformation
increased the total number of columns to 97, with the addition of the
new ‘Date’, ‘Month’, and ‘Year’ columns.
What is in every column? #Answer: The data set begins with the
case ID, followed by the employer’s name, address, and the case start
and end dates. In addition to these demographic details, there are
nearly 100 columns containing data related to the number of violations,
back wage amounts, and fines. From these, the 20 most relevant
indicators will be selected for analysis.
#Exclude the columns that contain only zeros in all rows.
#Process: I used the select() function to choose which columns to
keep, combined with where(~!all(. == 0)) to filter out columns where all
values are zero. The code ~!all(. == 0), means “keep columns where not
all values are zero”. It removes only columns where every single value
is zero. The result was stored back in the original dataset called
MO_wage_theft.
wage_theft %>%
select (where (~ sum (.! = 0, na.rm = TRUE) >0))
Error: unexpected '!' in:
"wage_theft %>%
select (where (~ sum (.!"
#Process: At this point in my analysis, I wanted to separate the
month and year from the findings_start_date column to perform time-based
analysis. Initially, I used the mdy() function to convert the
findings_start_date into separate Date, Month, and Year components.
However, I realized that the actual date format was “ymd”, so I switched
to using the ymd() function to properly extract the Month and Year.
While the function successfully separated the data, it returned a
warning message. After doing some research, I found that adding the
argument quiet = TRUE would suppress the warning. Once I included this,
I was able to separate the column cleanly without any further
warnings.With these updates, I created a new dataset called
US_wage_theft.I chose to analyze the findings_start_date because it
represents the point at which the Wage and Hour Division first
determines whether there is a violation or no violation in a case. This
date marks the beginning of the findings phase, where initial
conclusions are drawn based on available evidence and analysis.
US_wage_theft <- cleaned_wage_theft %>%
mutate (Date = ymd (findings_start_date), Month = month (findings_start_date), Year = year (findings_start_date))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `Date = ymd(findings_start_date)`.
Caused by warning:
! 3 failed to parse.
5.What are the date boundaries of the data? #Answer: According to the
dataset, the date range starts from 1900-01-07 and ends on 3590-01-01,
which both appear to be typos. After manually checking by arranging the
dates, I found that 18 rows contain incorrect or misleading date
entries. All other dates seem to be accurate.
#Final code:
range(US_wage_theft$Date, na.rm=T)
[1] "1900-01-07" "3590-01-10"
- In total, how many years and months of data are in this data set?
#Answer: I assume there are some errors in the date data. According to
the data source, the period starts from 1985. However, it also includes
data from the 1900s and 1960s. Additionally, there are 21 cases without
a date. Despite these errors, I consider them minimal and have analyzed
the data accordingly. The dataset spans a total of 436 months, from
January 1990 to March 2025.
#Process: To find the total number of months and years, I used the
count function, which provides month-wise data for each year.
- Are there any blank rows in the “case_id” column? #Answer: No, there
are no blank or missing values in the “case_id” column. Each row in the
dataset contains a valid case ID.
#Process: To ensure data completeness in the main column of the
dataset, I checked for any missing values in the “case_id” column using
the is.na() function. This function helps identify NA values (i.e.,
missing data). After applying the check, I confirmed that no rows have
missing values in the “case_id” column.
- Are there any blank rows in the “trade_nm” (Employer name) column?
#Answer: No, the employer/business name is mentioned in all rows. There
are no missing values in the “trade_nm” column.
#Process:I used the same is.na() function to check whether any
employer names were missing in the “trade_nm” column. The result showed
0 (zero) missing rows, which means no data is missing in this column
either.
- Are there any blank rows in the “date” column? #Answer: Yes, there
are 21 rows where the finding start date is not mentioned.
#Process:I used the same is.na() function to check whether any values
were missing in the “date” column. The result showed 21 missing rows,
indicating that the start date is not provided in those entries.
- Are there any blank rows in the “st_cd” (State name) column?
#Answer: Yes, there are 3 rows where the state name of the
employer/business is not mentioned.
#Process:I used the same is.na() function to check for missing values
in the “st_cd” column. The result showed 3 blank rows, indicating that
the state name is not provided in those rows.
- How many unique cases are in the data? #Answer: 357,269. This
indicates that there are no duplicate case ID numbers in the dataset—all
case IDs are unique.
#Process: I wanted to check how many unique case_id exist and whether
any case IDs are repeated or duplicated. For that, I used the
summarize() function with the n_distinct() code. The result returned the
same number of rows as in the dataset, which confirms that all case_id
values are unique.
- How many unique employers are in the data? #Answer: 298,751. This
indicates that many employers appear multiple times for wage violations
in different states across the U.S.
#Process:I wanted to check how many unique employers exist in the
dataset. For that, I used the summarize() function with the n_distinct()
code, similar to the previous question.
#Data analysis: Q1. Which state has the highest number of wage theft
cases in the United States, according to Wage and Hour Compliance Action
Data? Where does Missouri rank on the list? #Answer: Texas has the
highest number, with 45,983 individual cases of Wage and Hour Compliance
violations. Missouri ranks 13th on the list, with 7,871 violation
cases.
#Process: To identify the state-wise wage theft cases, I used the
count() function. Since each case is represented by an individual row,
and each row includes a specific state name, I counted the state using
the count() function. Then, I arranged the results in descending order
to find the state with the highest number of wage theft cases in the
U.S.
#However, the problem with the above code is that it does not reflect
the actual scenario of wage theft in each state. This is because every
state has its own demographic differences, such as population and area
size. For example, a state with a larger population is likely to have
more businesses, which could naturally result in a higher number of wage
theft cases compared to a smaller state. Therefore, to make a fair
comparison, I will examine which state has the highest number of wage
theft cases per 10,000 people, according to Wage and Hour Compliance
Action data.
Q2. Which state has the highest number of wage theft cases per 10,000
people, according to Wage and Hour Compliance Action data. Where does
Missouri rank on the list? #Answer:West Virginia, 20 cases in per 10,000
people. Missouri ranks 18th on the list, with around 13 violation cases
in per 10,000 people .
#Process: To get the answer for the state with the highest number of
wage theft cases per 10,000 people, I needed population data for each
U.S. state. For this, I used the tidycensus library. So, the first step
was to load that library. Next, I used the get_acs() function, as I was
already familiar with it from a weekly class assignment. I used the
variable B01003_001, which represents the total population. Since I
needed the population of each state, I set geography = “state”, and
selected the year 2023, as it’s the most recent data available for that
variable. This code gave me a dataset called US_state_population. Now,
to calculate wage theft cases per 10,000 people, I started by counting
how many times each state appears in the wage theft dataset
(specifically in the st_cd column). This count represents the number of
cases in each state. Next, I used mutate() to standardize state names in
both datasets. In the US_state_population dataset, states are listed by
their full names, while in the US_wage_theft dataset, they are
represented using abbreviations (e.g., “DC”). To match them, I used the
state.name[match()] function and included is.na to avoid potential
errors in case of missing matches. After standardizing names, I joined
the two datasets using a left join, bringing in both the state name and
population estimate. Then, I used mutate() again to calculate the number
of cases per 10,000 people by dividing the case count by the total
population of each state and multiplying the result by 10,000. Finally,
I arranged the result in descending order based on the cases_per_10K
value.
Q3. Which state has the highest total number of wage theft violations
per 10,000 people, according to Wage and Hour Compliance Action data.
Where does Missouri rank on the list? #Answer: Arkansas recorded the
highest number of wage theft violations per 10,000 people, with 2,910
cases. Missouri ranks 46th on the list, with 212 violations per 10,000
people.
#Process: To answer this question, I followed a process very similar
to the previous one, since the goal was again to calculate state-level
violations per 10,000 people. However, this time I needed the total
number of violations rather than just the count of entries.First, I
grouped the data by state using group_by(state), and then used the
summarize() function to calculate the total number of violations for
each state. Next, I followed the same procedure to merge the population
data using a left join, ensuring the population estimates were matched
with each state’s violation data. To calculate violations per 10,000
people, I used the mutate() function. I divided the total number of
violations by the population estimate for each state and then multiplied
the result by 10,000. Finally, I used arrange(desc(violations_per_10K))
to sort the results in descending order based on the violations per
10,000 people.
Q4. Which company affected the highest number of employees on average
in each wage theft case in the United States, according to Wage and Hour
Compliance Action Data? #Answer: Walmart. There are a total of 104 cases
across all states involving Walmart, with an average of 848 employees
affected per case.
#Process: To find the answer, I first grouped the data by employer
(trade_nm). Then, I used the summarize() function. I counted the total
number of cases using n(), and added up the number of affected employees
using the sum() function on ee_voiltd_cnt, which shows how many
employees were affected. After that, I get the average number of
affected employees per case by dividing the total number of affected
employees by the number of cases. But to keep the results fair, I didn’t
include companies that had very few cases. Sometimes a company with just
one case and many affected workers could end up at the top of the list.
So, I only included companies with more than 50 cases in the U.S.
Finally, I sorted the data from highest to lowest based on the average
number of affected employees per case to find out which company had the
most on average.
Q5. Which company or business committed the highest average number of
wage theft violations in the United States, according to Wage and Hour
Compliance Action Data? #Answer: Dollar General had the highest average
number of violations. The company was involved in 84 cases with a total
of 141,139 Wage and Hour Compliance violations. This means, on average,
Dollar General committed about 1,680 violations per case.
#Process: Process: Since the number of cases and the number of
violations are different, I wanted to find out which employers had the
highest number of violations. But just looking at the total number of
violations doesn’t show the full picture. For example, Wells Fargo Bank,
N.A. had the highest total violations (530,002), but it came from only
one case. So, I decided to look at the average number of violations per
case. To do this, I grouped the data by trade_nm (employer name), then
used the summarize() function to count the total number of cases and
total number of violations (case_violtn_cnt). After that, I calculated
the average violations per case by dividing total violations by total
cases. Finally, I arranged the results in descending order based on the
average violations per case. Like in the previous question, to keep the
results fair, I didn’t include companies that had very few cases.
Sometimes, a company with just one case and many violations could end up
at the top of the list, which wouldn’t show the real picture. So, I only
included companies that had more than 50 cases across the U.S.
Q6. Which employer/business had to pay the highest amount in back
wages to its employees for violating Hour and Wage Compliance across the
U.S.? #Answer: Puerto Rico Department of Corrections —
$39,950,933.10.
#Process:“Back Wages Agreed to Pay” is an important indicator, as it
reflects the financial restitution provided to workers who were victims
of wage theft or other labor violations. Therefore, I wanted to find out
which employers had to pay the highest amount in back wages.To analyze
this, I followed a similar approach as in the previous question.
However, this time I summarized the bw_atp_amt (back wages agreed to
pay) and arranged the results in descending order. The outcome revealed
some new employer names that were not at the top in the previous
analysis, indicating that different employers are associated with
different types and levels of violations. Furthermore, I wanted to see
how many employees were set to receive those back wages. So, I added
another sum() function for the ee_atp_cnt indicator, which refers to the
total number of employees receiving back wages. This result appeared in
a separate column alongside the total back wages.
Q7. Which employer/business had to pay the highest total amount of
civil money penalties (CMP) for violating Hour and Wage Compliance
across the U.S.? #Answer: The results contain some errors. I am getting
the same trade name appearing twice after grouping the data. I couldn’t
figure out exactly why this is happening, but I found that there is a
problem with the trade name field.
Q8. Which employer/business violated Hour and Wage Compliance against
the highest number of employees in the U.S.? #Answer: Walmart. A total
of 88,278 employees were affected by Walmart’s violations of Hour and
Wage Compliance, which is the highest number in U.S.
#Process: Another important variable in this dataset is
ee_violtd_cnt, which refers to the number of employees affected by
violations. Using this variable, I wanted to identify which employers
affected the highest number of employees across the U.S. To analyze
this, I grouped the data by trade_nm (employer name) and summarized the
“ee_violtd_cnt” variable. Then, I arranged the results in descending
order to highlight the employers with the greatest number of affected
employees.
Q9. What is the year-wise trend for Wage & Hour Compliance
violation cases in the U.S.? #Answer: The year 2010 recorded the highest
number of cases, with 24,954. However, the analysis shows that the
period from 2009 to 2013 saw the highest yearly case counts for Wage
& Hour Compliance violations. The total number of violations varied
across these years. For example, in 2012, the total number of cases was
comparatively lower among the top five years, but the total number of
violations was the highest.
#Process: I wanted to analyze the year-wise trend of total Wage &
Hour Compliance violation cases and the total number of violations. To
do this, I grouped the data by year and then summarized both the number
of cases and the total violations.For the number of cases, I used the
count() function with n() to count each case as a single, unique
instance. For violations, I used sum() to calculate the total number of
violations across all cases for each year. Finally, I arranged the
results of total cases in descending order to observe which years had
the highest numbers of cases.
Q10. What is the trend in Wage & Hour Compliance violation cases
in the U.S. over the last 10 years? #Answer: Wage & Hour Compliance
violation cases across the U.S. have been steadily decreasing over the
past 10 years. In 2015, the total number of cases was 18,500, which
dropped significantly to just 717 in 2024. However, the total number of
violations within these cases varied by year. Despite these
fluctuations, the number of violations has also shown a downward trend
since 2019.
#process: For this question, I followed a similar approach as in the
previous questions, but added a filter for specific years. To apply the
filter, I used the %in% c() syntax for accurate results.
Q11. Which industry has the highest number of Wage & Hour
Compliance cases and violations in the U.S.? How many employees were
affected in those industries?
#Answer: I have two answers to this question. If I look at the raw
data without considering business size or context, the Restaurant and
Hotel industry has the highest number of Wage & Hour Compliance
cases. This industry also leads in total violations and the number of
affected employees. However, not all industries are equal in size, so
comparing total numbers alone may not give the full picture. When I
calculate the average number of violations per case, the results change.
In that case, Health and Personal Care Stores have the highest average,
with about 3,710 violations per case.
#Process (Answer 1 – Total Numbers): To identify industry-wise
patterns, I grouped the dataset by naics_code_description, which shows
the industry name. After grouping, I summarized three key things: Total
number of cases (using n()), Total number of violations (using
sum(case_violtn_cnt)), Total affected employees (using
sum(ee_voiltd_cnt)). Then, I arranged the results in descending order
based on the number of cases to find which industries had the most
reported wage and hour violations.
#Process (Answer 2 – Average Violations per Case): For a fairer
comparison, I again grouped the data by naics_code_description. I used
summarize() to: Count total cases using n(), Sum total violations and
affected employees, Calculate the average violations per case by
dividing total violations by the case count. To avoid misleading results
from industries with very few cases, I filtered for industries with at
least 50 cases. Finally, I sorted the data by average violations in
descending order.
Q12: Which indicators of Wage & Hour Compliance Action data have
the highest total violations? #Answer: Family and Medical Leave Act
(FMLA) violation: 6,618,226. Following Service Contract Violation:
480,704.
#Process: Wage & Hour Complince Action data has more than 80
variable, half of those are relate to voilation count. Among them 6
veriable are most impotant to follow accoding to Department of Labor.
That why I messure those to answer this question. First, I selected six
specific violation-related columns from the dataset: flsa_violtn_cnt
(Fair Labor Standards Act violations), mspa_violtn_cnt (Migrant and
Seasonal Agricultural Worker Protection Act violations), sca_violtn_cnt
(Service Contract Act violations), fmla_violtn_cnt (Family and Medical
Leave Act violations), h1b_violtn_cnt (H-1B work visa violations),
flsa_cl_violtn_cnt (Child Labor violations under FLSA). Then, I used the
summarize() function to calculate the total number of violations under
each law. I renamed the output columns for clarity, so each total
reflects the respective violation type. However, the way the results
were displayed using the previous function made it difficult to measure
or analyze the data clearly. Therefore, I wanted to restructure the
output by having all violation types listed in one column and their
corresponding violation numbers in another column. To achieve this, I
used the pivot_longer() function. In my mid-term project, I had used
pivot_wider(), so I was already familiar with how the pivot_longer()
function works. I applied it here to display the results in a more
readable format and then arranged them in descending order for easier
comparison and analysis.
Q13: How has the number of major indicators of Wage & Hour
Compliance violations varied over the years? #Answer: The results show
that every major indicator has decreased significantly over the past ten
years. For instance, Fair Labor Standards Violations dropped from 3,550
in 2015 to just 42 in 2024. Service Contract Violation was 22,289 in
2015 and declined to 200 in 2024. Family and Medical Leave Violations
decreased from 220,774 to 2,872. Child Labor Violation also saw a
reduction, from 3,550 in 2015 to 42 in 2024. This trend indicates
substantial improvement in wage and hour compliance over the last
decade.
#Process: To analyze year-wise data for each indicator, I first
grouped the dataset by year. Since the dataset spans a long period, I
filtered it to only include the most recent 10 years using the %in%
operator. Then, I used the same code structure from the previous
question to summarize violations for six major indicators. I also
intended to calculate the negative growth percentage over the ten-year
span to show the rate of improvement but was unable to write a code it
successfully. Instead, I sorted the summarized data by year to observe
the trend.
US_wage_theft %>%
filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
group_by(Year) %>%
select(flsa_violtn_cnt, mspa_violtn_cnt, sca_violtn_cnt,
fmla_violtn_cnt, h1b_violtn_cnt, flsa_cl_violtn_cnt) %>%
summarize (Fair_Labor_Standards_Violation = sum (flsa_cl_violtn_cnt),
Migrant_Agricultural_Protection_Violation = sum (mspa_violtn_cnt),
Service_Contract_Violation = sum (sca_violtn_cnt),
Family_Medical_Leave_Violation = sum (fmla_violtn_cnt),
Immigration_Work_Violation = sum (h1b_violtn_cnt),
Child_labor_Violation = sum (flsa_cl_violtn_cnt)) %>%
arrange (Year)
Adding missing grouping variables: `Year`
Q14. How do the top five states that have done the highest violations
in per 10,000 people vary in terms of total violations of Wage and Hour
Compliance over the last 10 years? #Answer: All five states have seen
decreases in violations by 2024. Every state’s total violation was below
a 500 last year. Arkansas had the highest violations in 2016 with
456,237 and remained one of the top violators. Tennessee saw two spikes
in violations: 266,410 in 2019 and 240,982 in 2021. Alabama had high
violations in the early years, especially in 2016 (144,881), then
declined. Rhode Island showed consistent mid-to-high violations with a
peak in 2020 (1,378). Minnesota had a high violation in 2017 (36,092)
but saw a decline afterward.
#Process: To answer this question, I filtered the data by both State
and Year, as I needed information for five specific states over the last
ten years. From the beginning of my code, I used the %in% operator to
select only the relevant states and years.Next, I grouped the data by
both Year and State, since I needed the violation numbers for each state
across each year. After grouping, I summarized the total number of
violations for each combination of year and state. Finally, to present
the data clearly in a tabular format, I used the pivot_wider() function
to reshape the data—making each state a separate column with years as
rows.
US_wage_theft %>%
filter(st_cd %in% c("AR", "RI", "TN", "MN", "AL")) %>%
filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
group_by(Year, st_cd) %>%
summarize(total_violation = sum(case_violtn_cnt)) %>%
pivot_wider(names_from = "st_cd",
values_from = "total_violation")
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
Q15. How have the states varied in terms of total violations of Wage
and Hour Compliance over the last 10 years? #Answer: The data does not
provide a single, specific answer but rather a table with 10 columns and
57 rows representing different states and territories. However, states
with the highest total number of violations also tend to rank high
across each year. However, the trend of numbers for each state has been
declining.
#Process: To answer this question, I filtered the data by Year, as I
needed information for ten specific years. I used the %in% operator to
select only the relevant years. Next, I grouped the data by both Year
and State, since I needed the violation numbers for each state across
filtered year. After grouping, I summarized the total number of
violations for each combination of year and state. Finally, to present
the data clearly in a tabular format, I used the pivot_wider() function
to reshape the data—making each state a separate column with years as
rows.
US_wage_theft %>%
filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
group_by(Year, st_cd) %>%
summarize(total_violation = sum(case_violtn_cnt)) %>%
pivot_wider(names_from = "st_cd",
values_from = "total_violation")
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
Q16. Which state takes the longest time to complete a finding on
average? #Answer: Rhode Island takes the longest time to complete a
finding, with an average of 675 days, which is almost two years. The
median time to complete a case there is even higher—728 days.
#Process: To find the answer, I first created a new variable in the
dataset called Days_to_complete, which I calculated by subtracting
findings_start_date from findings_end_date using the as.numeric()
function. Next, I arranged the data by Days_to_complete in descending
order. However, I found some incorrect values in the dates—some records
showed dates like the year 1900 or 3519, which are likely typos.
According to the data dictionary, the Wage & Hour Compliance Action
Data includes records only from 1985 to the present, so I filtered the
data to include only dates between 1985 and 2025. After filtering, I
grouped the data by state to see which states took the longest time to
complete a case. I then used the summarize() function to calculate both
the average (mean) and median number of days to complete a finding. To
keep the results realistic and avoid missleading results from states
with very few cases, I filtered for states with more than 50 cases.
#Missouri specific dataset:
#Process: After analyzing national percspective from the Wage and
Hour Compliance Action Data, I wanted to look into missouri specific
data set. Therefore I filter Missouri data only for my further analysis.
For that, I use filter funtion and create a new data set called
“MO_wage_theft” for furthur analysis.
#Missouri clean dataset #Exclude the columns that contain only zeros
in all rows.
#Process: I fllowed this process in national data set as well to
exclude the rows those have any data. I used the select() function to
choose which columns to keep, combined with where(~!all(. == 0)) to
filter out columns where all values are zero. The code ~!all(. == 0),
means “keep columns where not all values are zero”. It removes only
columns where every single value is zero. The result was stored back in
the original dataset called MO_wage_theft with 75 columns, which was 98
for national data set.
MO_wage_theft <- MO_wage_theft %>%
select(where(~!all(. == 0)))
Error: object 'MO_wage_theft' not found
#Standardize the City Names to All Uppercase Letters #Process: I
found that some city names appeared in different formats—for instance,
both “Saint Louis” and “SAINT LOUIS” were present. To ensure consistency
in my analysis, I standardized all city names to uppercase. To do this,
I used the mutate() function along with the toupper() function. The
toupper() function converts all text in the cty_nm column to uppercase
letters. I updated the original dataset by assigning the result back to
the same name: MO_wage_theft.
Q17: Which company/employer in Missouri had the highest record of
Wage & Hour Compliance cases and number of violations? #Answer: I
have two answers to this question. If I look at the raw data without
considering business size or context, Highest number of cases: Subway,
with 33 cases. Highest number of violations: George’s Processing,
Incorporated, with a total of 3,148 violations across 2 cases. However,
not all business are equal in size, so comparing total numbers alone may
not give the full picture. When I calculate the average number of
violations per case, the results change. In that case, Imo’s Pizza have
the highest average, with about 23 violations per case.
#Process 1 (Total Numbers): To get the total number of cases and
violation, I used a similar approach in both cases, with only a small
difference in the arrangement step. I wanted to present the number of
cases and total violations at the same time, but since the employers
with the highest case count and highest total violations were different,
I wrote two separate code blocks. The codewas simple and similar to what
I used for the national-level data. First, I grouped the data by
trade_nm (employer name), then summarized it. For the number of cases, I
used the n() function to count how many times each employer appeared in
the trade_nm column—each appearance represents a case.For the total
number of violations, I used the sum() function to calculate the total
violation count per employer.
#Process 2 (Average Violations per Case): For a fairer comparison, I
again grouped the data by business (trade_nm). I used summarize() to:
Count total cases using n(), Sum total violations and affected
employees, Calculate the average violations per case by dividing total
violations by the case count. To avoid misleading results from business
with very few cases, I filtered for business with at least 10 cases.
Finally, I sorted the data by average violations in descending
order.
Q18: Which company/employer in Missouri had to pay the highest back
wages, and how many employees received those back wages from each
employer? #Answer: George’s Processing, Incorporated paid a total of
$1,245,257.09 to 3,084 employees.
#Process: To find the answer, I grouped the data by employer name
(trade_nm). Then, I summarized the data using both bw_atp_amt (which
represents back wages paid) and ee_atp_cmt (which represents the number
of employees who received those wages). I arranged the summarized data
in descending order by total back wages. Since the employer who paid the
highest amount also happened to pay the highest number of employees, I
didn’t need to write a separate code for employee count—both results
could be shown in one table.
Q19: Which employer/business had to pay the highest total amount of
Civil Money Penalties (CMP) in Missouri for violating Wage and Hour
Compliance? #Answer: Missouri Vegetable Farm paid the highest total
amount in civil money penalties, with $384,626.61.
#Process: To find this, I grouped the data by employer name
(trade_nm). After that, I summarized the cmp_assd column, which
represents the total amount of civil money penalties imposed on
employers. Finally, I arranged the results in descending order based on
the total CMP amount (cmp_assd) to identify the top violator.
Q20: Which city in Missouri experienced the highest number of cases,
highest number of violations, and the most affected employees according
to the Wage & Hour Compliance violation data? #Answer: Saint Louis
recorded the highest numbers with 1,487 cases, 25,019 total violations,
and 21,956 affected employees.
#Process: First, I grouped the data by city name (cty_nm). To answer
all three parts of the question together, I used the summarize()
function: For the number of cases, I used the n() function. Since each
row represents a case, counting how many times a city appears gives the
total number of cases. For total violations and affected employees, I
used the sum() function on the relevant columns. Finally, I arranged the
results in descending order by the number of cases.
Q21: In which year did Missouri experience the highest number of
cases, highest number of violations, and the most affected employees
according to the Wage & Hour Compliance violation data? #Answer: The
highest number of cases was filed in 2009, with 527 cases. The highest
number of violations occurred in 2006, with 12,329 violations. That same
year (2006), 11,907 employees were affected—the highest recorded.
#Process:The process was similar to the one I used in previous
questions. I started by grouping the data by year, then used count() and
summarize() to get values for the three variables: number of cases,
total violations, and number of affected employees.Since the year with
the most cases was different from the year with the most violations and
affected employees, I used the same code but arranged the results
separately—first by case count, then by total violations—to identify
each highest year.
Q22: How has Missouri been experiencing Wage & Hour Compliance
cases, violations, and affected employees over the last 10 years?
#Answer: Missouri has been experiencing a declining trend in Wage and
Hour Compliance violations since 2020. In that year, the total number of
cases was 318, which dropped significantly to 6 cases by 2024. Five
years ago, the total number of violations was 3,661, and the number of
affected employees was 3,066. In 2024, these numbers declined to 88
violations and 60 affected employees, respectively
#Process: To analyze the last 10 years, I filtered the dataset using
the %in% operator and listed each of the last ten years explicitly.
After filtering, I followed the same approach as in the previous
question: I grouped the data by year and then used count() and
summarize() to calculate the number of cases, total violations, and
affected employees. Finally, I arranged the data in ascending order to
get year-wise trends clearly.
Q23. Which industry in Missouri experienced the highest number of
cases, the highest number of violations, and the most affected employees
according to the Wage & Hour Compliance violation data? #Answer:
Full-Service Restaurants recorded the highest numbers with 915 cases,
15,664 total violations, and 12,979 affected employees. In fact top
three industries of the table are related to lauiser and hospitality
business: Full-Service Restaurants, Limited-Service Restaurants, and
Hotels (except Casino Hotels) and Motels.
#Process: First, I grouped the data by industry
(naics_code_description). To answer all three parts of the question
together, I used the summarize() function: For the number of cases, I
used the n() function. Since each row represents a case, counting how
many times a industry name appears gives the total number of cases. For
total violations and affected employees, I used the sum() function on
the relevant columns. Finally, I arranged the results in descending
order by the number of cases.
Q24. Which indicators of Wage & Hour Compliance Action data have
the highest total violations in Missouri? #Answer:
Service_Contract_Violation: 6,208. following
Family_Medical_Leave_Violation: 2,455.
#Process: Missouri Wage & Hour Complince data set has 75
variable, half of those are relate to voilation count. Among them 6
veriable are most impotant to follow accoding to Department of Labor. I
messured those for national data as well. Those six indicators/veriables
are: flsa_violtn_cnt (Fair Labor Standards Act violations),
mspa_violtn_cnt (Migrant and Seasonal Agricultural Worker Protection Act
violations), sca_violtn_cnt (Service Contract Act violations),
fmla_violtn_cnt (Family and Medical Leave Act violations),
h1b_violtn_cnt (H-1B work visa violations), flsa_cl_violtn_cnt (Child
Labor violations under FLSA). I select those for to show them in my
analysis only. Then, I used the summarize() function to calculate the
total number of violations under each law. I renamed the output columns
for clarity, so each total reflects the respective violation type.
However, the way the results were displayed using the previous function
made it difficult to measure or analyze the data clearly. Therefore, I
wanted to restructure the output by having all violation types listed in
one column and their corresponding violation numbers in another column.
To achieve this, I used the pivot_longer() function. Then arranged them
in descending order for easier comparison and analysis.
Q25: How has the violation number of the 6 major indicators of Wage
& Hour Compliance Action data varied over the years in Missouri?
#Answer: The results show that all six major indicators have decreased
significantly over the past ten years in Missouri. However, some of them
experienced increases during the mid-years. For example, during the
pandemic in 2020 and 2021, Fair Labor Standards Violations rose to 140,
but dropped to 3 by 2024. Service Contract Violations fell from 375 in
2017 to zero in 2024. Child Labor Violations also declined, from 60 in
2015 to 3 in 2024.
#Process: To analyze year-wise data for each indicator, I first
grouped the dataset by year. Since the dataset spans a long period, I
filtered it to only include the most recent 10 years using the %in%
operator. Then, I used the same code structure from the previous
question to summarize violations for six major indicators. I also
intended to calculate the negative growth percentage over the ten-year
span to show the rate of improvement but was unable to write a code it
successfully. Instead, I sorted the summarized data by year to observe
the trend.
MO_wage_theft %>%
filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
group_by(Year) %>%
select(flsa_violtn_cnt, mspa_violtn_cnt, sca_violtn_cnt,
fmla_violtn_cnt, h1b_violtn_cnt, flsa_cl_violtn_cnt) %>%
summarize (Fair_Labor_Standards_Violation = sum (flsa_cl_violtn_cnt),
Migrant_Agricultural_Protection_Violation = sum (mspa_violtn_cnt),
Service_Contract_Violation = sum (sca_violtn_cnt),
Family_Medical_Leave_Violation = sum (fmla_violtn_cnt),
Immigration_Work_Violation = sum (h1b_violtn_cnt),
Child_labor_Violation = sum (flsa_cl_violtn_cnt)) %>%
arrange (Year)
Adding missing grouping variables: `Year`
Q26. How did the top five cities in Missouri with the highest total
violations of Wage and Hour Compliance over the last 10 years vary?
#Answer: Among the top five cities in Missouri that recorded the highest
total violations, SPRINGFIELD, COLUMBIA, INDEPENDENCE did not have any
violations of Wage and Hour Compliance in the 2024. All five cities have
seen decreases in total violations by 2024 compared to 2015. However,
Saint Louis recorded a higher number of violations in 2022 (312) than in
the previous year (162). Columbia declined from 556 violations in 2015
to zero for the last two years. Kansas City experienced 2 violations in
2024, down from 957 in 2017. Saint Louis had the highest violations in
2017, with 1,324, and remained the top city. Independence also saw
spikes in violations, reaching 1,611 in 2017. Springfield showed
consistent mid-to-high violations, with a peak in 2020 (641).
#Process: To answer this question, I filtered the data by both city
and year, as I needed information for five specific cities over the last
ten years. From the beginning of my code, I used the %in% operator to
select only the relevant years and cities. Next, I grouped the data by
both year and city, as I needed the violation numbers for each city
across each year. After grouping, I summarized the total number of
violations for each combination of year and city. Finally, to present
the data in a tabular format, I used the pivot_wider() function to
reshape the data—making each city a separate column with years as
rows.
MO_wage_theft %>%
filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
filter(cty_nm %in% c("SAINT LOUIS", "KANSAS CITY", "SPRINGFIELD", "COLUMBIA", "INDEPENDENCE")) %>%
group_by(Year, cty_nm) %>%
summarize(total_violation = sum(case_violtn_cnt)) %>%
pivot_wider(names_from = "cty_nm",
values_from = "total_violation")
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
Q27. Which Wage and Hour Compliance violation case in Missouri took
the longest time to complete? #Answer: The case number is 1035967. It is
against Blue Springs Lawn & Garden from Blue Springs, Missouri. This
case took 4,840 days to complete, which is more than 13 years. The
findings began on September 26, 1997, and ended on December 27,
2010.
#Process: To find the answer, I first created a new variable in the
dataset called Days_to_complete, which I calculated by subtracting
findings_start_date from findings_end_date using the as.numeric()
function. Next, I filtered the data by state for get only MO data.
Finnaly I arrange the data in descending order to find the answer.
Q28. What are the average and median days to complete a Wage and Hour
Compliance violation case in Missouri? #Answer: The average number of
days to complete a Wage & Hour Compliance violation case in Missouri
is 589 days, and the median is 728 days, which is almost two years.
#Process: To find the answer, I first created a new variable in the
dataset called Days_to_complete, which I calculated by subtracting
findings_start_date from findings_end_date using the as.numeric()
function. Next,to calculate the average and median values for the days
to complete, I used the summarize function and wrote code to compute
both the mean (average) and median. I also added na.rm = TRUE to avoid
the NA values in the column. Since the column contained a few NA values,
using na.rm = TRUE ensured that the calculation was based only on the
available data; otherwise, the result would have been NA.
Q29. In which industry do Wage & Hour Compliance violation cases
take the longest median time to complete? And how has the time to
complete a case in Missouri changed in the last 10 years?
#Answer: The industry with the longest median time to complete a Wage
& Hour Compliance violation case is Technical and Trade Schools. It
takes 3,521 days—or about nine and a half years—to close a case in this
industry. In Missouri, the median number of days to complete a case has
dropped significantly over the last 10 years. In 2015, it was 729 days,
but in 2024, it came down to just 146 days.
#Process: To find the median number of days to complete a case by
industry, I grouped the dataset by the naics_code_description column,
which represents industry names. Then, I used the summarize() function
to calculate the median of the Days_to_complete variable. I arranged the
results in descending order to identify which industries take the
longest time. To analyze Missouri’s trend over the last 10 years, I
first filtered the dataset for cases in Missouri and for years 2015
through 2024. Then, I grouped the data by year, used the summarize()
function again to find the median completion time each year, and tracked
how it changed over time.
Q30. Which employer in Missouri violated the service contract the
most, and which industry tops the list for service contract violations?
#Answer: The employer that violated the service contract the most in
Missouri is Abbott Ambulance, with a total of 1,083 violations.
Industry-wise, Tax Preparation Services had the highest number of
service contract violations, totaling 920.
#Process: This question has two parts, so I wrote two separate pieces
of code. However, both followed a similar structure, with only the
grouping variable being different. To find the employer and the industry
with the highest service contract violations, I used the group_by()
function to group the data accordingly. Then, I used the summarize()
function to calculate the total service contract violations. Finally, I
arranged the results in descending order based on the number of service
contract violations.
Q31. Which employer in Missouri violated the Fair Labor Standards the
most, and which industry tops the list for Fair Labor Standards
violations? #Answer: The employer that violated the Fair Labor Standards
Act the most in Missouri is Dog Days Bar and Grill, with a total of 41
violations. Industry-wise, Full-Service Restaurants had the highest
number of Fair Labor Standards violations, totaling 375.
#Process: This question has two parts, similar to the previous one.
The only difference is that the main variable this time is Fair Labor
Standards. I summarized the data in both pieces of code by grouping
first by employer and then by industry name. Finally, I arranged the
results by the Fair Labor Standards violation count in decending
order.
Q32. Which employer in Missouri violated the Family and Medical Leave
Act the most, and which industry tops the list for Family and Medical
Leave Act violations? #Answer: The employer that violated the Family and
Medical Leave Act the most in Missouri is West County Care Center, with
a total of 1,380 violations. Industry-wise, Nursing Care Facilities had
the highest number of Family and Medical Leave Act violations, totaling
1,421.
#Process: This question is similar to the previous two. Therefore, I
followed almost the same process to answer this question, with the only
change being the variable related to the Family and Medical Leave
Act.
Q33. Which employer in Missouri violated the Child Labor Act the
most, and which industry and city top the list for Child Labor Act
violations? #Answer: The employer that violated the Child Labor Act the
most in Missouri is Dog Days Bar and Grill, with a total of 41
violations. Industry-wise, Full-Service Restaurants had the highest
number of Child Labor Act violations, totaling 375. The city with the
highest number of Child Labor Act violations is SPRINGFIELD, with 133
incidents.
#Process: This question is similar to the previous three, but this
time I also included city as an additional factor to identify which city
in Missouri experienced the most Child Labor violations. To answer all
three parts of the question, I followed the same general
process—grouping the data by employer, industry, and city—then
summarizing the total number of Child Labor violations. The only change
was using the variable related to Child_labor_Violation.
Q34. Which employer/business in Missouri violated all six major
indicators of Wage and Hours Compliance? #Answer: None.
#Process: To get the answer, I used the filter function. As I needed
to find trade names of businesses that had violations in all six
categories, I filtered for rows that had values greater than zero in all
six columns (since zero means no violation). I wanted to see if any
company had violations in all six categories, which is why I filtered
using >0 for each variable. Finally, I selected the trade_nm column
so that if any employer had violations in all six categories, their
trade name would appear.
LS0tCnRpdGxlOiAiU2F1cmF2IFJhaG1hbl9maW5hbF9wcm9qZWN0X0FESjI1IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojU3VtbWFyeSAoTmF0aW9uYWwpOiBBY2NvcmRpbmcgdG8gdGhlIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSwgVGV4YXMgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzLCB3aXRoIDQ1LDk4MyBpbmRpdmlkdWFsIGNhc2VzLCB3aGlsZSBGbG9yaWRhIGhhcyB0aGUgaGlnaGVzdCB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucywgd2l0aCAxLDE4NSwwNTQgdmlvbGF0aW9ucyBhY3Jvc3MgMjksMDQ2IGNhc2VzLiBXaGVuIGFkanVzdGVkIGZvciBwb3B1bGF0aW9uLCBXZXN0IFZpcmdpbmlhIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBwZXIgMTAsMDAwIHBlb3BsZSwgd2l0aCAyMCBjYXNlcyBwZXIgMTAsMDAwIHJlc2lkZW50cy4gTWlzc291cmkgcmFua3MgMTh0aCBvbiB0aGlzIGxpc3QsIHdpdGggYXJvdW5kIDEzIGNhc2VzIHBlciAxMCwwMDAgcGVvcGxlLiBJbiB0ZXJtcyBvZiB2aW9sYXRpb25zIHBlciAxMCwwMDAgcGVvcGxlLCBBcmthbnNhcyByYW5rcyBmaXJzdCB3aXRoIDIsOTEwIHZpb2xhdGlvbnMsIHdoaWxlIE1pc3NvdXJpIHJhbmtzIDQ2dGgsIHdpdGggMjEyIHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUuIEFtb25nIGNvbXBhbmllcywgU3Vid2F5IGhhcyB0aGUgbW9zdCB3YWdlIHRoZWZ0IGNhc2VzIGZpbGVkIGFnYWluc3QgaXQsIHRvdGFsaW5nIDEsMzU5IGNhc2VzLiBXZWxscyBGYXJnbyBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIHdpdGggNTMwLDAwMiB2aW9sYXRpb25z4oCUYWx0aG91Z2ggYWxsIGZyb20gYSBzaW5nbGUgY2FzZS4gV2FsbWFydCBoYXMgdGhlIGhpZ2hlc3QgYXZlcmFnZSBudW1iZXIgb2YgYWZmZWN0ZWQgZW1wbG95ZWVzIHBlciBjYXNlLCB3aXRoIDEwNCBjYXNlcyBhY3Jvc3MgYWxsIHN0YXRlcyBhbmQgYW4gYXZlcmFnZSBvZiA4NDggZW1wbG95ZWVzIGFmZmVjdGVkIHBlciBjYXNlLCB0b3RhbGluZyA4OCwyNzggd29ya2Vycy4gRG9sbGFyIEdlbmVyYWwgaGFkIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UuIFRoZSBjb21wYW55IHdhcyBpbnZvbHZlZCBpbiA4NCBjYXNlcyB3aXRoIGEgdG90YWwgb2YgMTQxLDEzOSB2aW9sYXRpb25zLCB3aGljaCBtZWFucyBpdCBjb21taXR0ZWQgYWJvdXQgMSw2ODAgdmlvbGF0aW9ucyBwZXIgY2FzZSBvbiBhdmVyYWdlLiBUaGUgUHVlcnRvIFJpY28gRGVwYXJ0bWVudCBvZiBDb3JyZWN0aW9ucyB3YXMgcmVxdWlyZWQgdG8gcGF5IHRoZSBoaWdoZXN0IGFtb3VudCBpbiBiYWNrIHdhZ2Vz4oCUJDM5LDk1MCw5MzMuMTAuIEluZHVzdHJ5LXdpc2UsIHRoZSByZXN0YXVyYW50IGFuZCBob3RlbCBpbmR1c3RyeSBoYXMgdGhlIGhpZ2hlc3QgdG90YWwgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgdmlvbGF0aW9ucy4gSG93ZXZlciwgaW4gdGVybXMgb2YgYXZlcmFnZSB2aW9sYXRpb25zIHBlciBjYXNlLCBIZWFsdGggYW5kIFBlcnNvbmFsIENhcmUgU3RvcmVzIHJhbmsgaGlnaGVzdCwgd2l0aCBhYm91dCAzLDcxMCB2aW9sYXRpb25zIHBlciBjYXNlLiBPdmVyIHRoZSBsYXN0IDEwIHllYXJzLCBib3RoIHRoZSBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBhbmQgdmlvbGF0aW9ucyBoYXZlIGRlY2xpbmVkLCBzdWdnZXN0aW5nIHBvc3NpYmxlIGltcHJvdmVtZW504oCUZXNwZWNpYWxseSB3aXRoIHRoZSBlbmZvcmNlbWVudCBvZiBsYXdzIGxpa2UgdGhlIEZhbWlseSBhbmQgTWVkaWNhbCBMZWF2ZSBBY3QgKEZNTEEpIGFuZCBjaGlsZCBsYWJvciBwcm90ZWN0aW9ucy4KCiNQcm9qZWN0IGlkZWE6IFRyYWNraW5nIFdhZ2UgVGhlZnQgaW4gQW1lcmljYQojRGV0YWlsczogQ3JlYXRlIGEgaW50ZXJhY3RpdmUgcG9ydGFsIHdoZXJlIHBlb3BsZSBleHBsb3JlIGRlY2FkZS1sb25nIHRyZW5kcyBpbiB3YWdlIHRoZWZ0IGJ5IHN0YXRlLCBpbmR1c3RyeSwgZW1wbG95ZXIgYW5kIGFsbCBvdGhlciByZWxhdGVkIGluZm9ybWF0aW9uLiAKCiNTdG9yeSBpZGVhOgojMTogV2FnZSB0aGVmdCBjYXNlcyBhcmUgZ29pbmcgZG93buKAlGJ1dCB3aHk/IApBbiBhbmFseXNpcyBvZiB3aHkgd2FnZSB0aGVmdCBpcyBoYXBwZW5pbmcgbGVzcyBvZnRlbiBub3cgYW5kIGlmIHRoYXTigJlzIHJlYWxseSBhIGdvb2Qgc2lnbi4KIzI6V29ya2VycyBpbiBIZWFsdGggYW5kIFBlcnNvbmFsIENhcmUgU3RvcmVzIGZhY2VzIHRoZSBtb3N0IHdhZ2UgdGhlZnQuCldoeSBhbmQgaG93IHBlb3BsZSBpbiB0aGUgSGVhbHRoIGFuZCBQZXJzb25hbCBDYXJlIFN0b3JlcyBhcmUgdGhlIG1vc3QgbGlrZWx5IHRvIGJlIGFmZmVjdGVkIGJ5IHdhZ2UgdGhlZnQuCiMzOiBXaHkgV2VzdCBWaXJnaW5pYSBhbmQgQXJrYW5zYXMgaGF2ZSB0aGUgbW9zdCB3YWdlIHRoZWZ0IGluIHBlciAxMCwwMDAgcG9wdWxhdGlvbj8KQW4gaW52ZXN0aWdhdGl2ZSBsb29rIGF0IHdoeSB0aGVzZSB0d28gc3RhdGVzIGhhdmUgbW9yZSB3YWdlIHRoZWZ0IHRoYW4gb3RoZXJzLgojNC4gV2h5IGRvZXMgUmhvZGUgSXNsYW5kIHRha2UgdGhlIGxvbmdlc3QgdGltZSB0byBjb25jbHVkZSBhIHdhZ2UgdGhlZnQgY2FzZT8KRXhwbG9yZSB0aGUgcmVhc29ucyBiZWhpbmQgUmhvZGUgSXNsYW5kJ3MgdW51c3VhbGx5IGxvbmcgYXZlcmFnZSBjYXNlIGR1cmF0aW9uIGZvciByZXNvbHZpbmcgd2FnZSB0aGVmdC4KCiNTdW1tYXJ5IChNaXNzb3VyaSk6IEluIE1pc3NvdXJpLCBHZW9yZ2UncyBQcm9jZXNzaW5nLCBJbmNvcnBvcmF0ZWQgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbnMsIHdpdGggMywxNDggdmlvbGF0aW9ucyBhY3Jvc3MgMiBjYXNlcy4gVGhlIGNvbXBhbnkgYWxzbyBwYWlkIHRoZSBoaWdoZXN0IGFtb3VudCBpbiBiYWNrIHdhZ2Vz4oCUJDEsMjQ1LDI1Ny4wOeKAlHRvIDMsMDg0IGVtcGxveWVlcy4gSXQgYWZmZWN0ZWQgdGhlIG1vc3Qgd29ya2VycyBpbiB0aGUgc3RhdGUsIHdpdGggYSB0b3RhbCBvZiAzLDE0NyBlbXBsb3llZXMgaW1wYWN0ZWQuIEhvd2V2ZXIsIHNpbmNlIGJ1c2luZXNzZXMgdmFyeSBpbiBzaXplLCBjb21wYXJpbmcgdG90YWwgbnVtYmVycyBhbG9uZSBtYXkgbm90IHByb3ZpZGUgYSBjb21wbGV0ZSBwaWN0dXJlLiBXaGVuIGxvb2tpbmcgYXQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UsIHRoZSByZXN1bHRzIGRpZmZlcuKAlEltbydzIFBpenphIGhhZCB0aGUgaGlnaGVzdCBhdmVyYWdlLCB3aXRoIGFib3V0IDIzIHZpb2xhdGlvbnMgcGVyIGNhc2UuIE1pc3NvdXJpIFZlZ2V0YWJsZSBGYXJtIHBhaWQgdGhlIGhpZ2hlc3QgY2l2aWwgbW9uZXkgcGVuYWx0aWVzLCB0b3RhbGluZyAkMzg0LDYyNi42MS4gVGhlIGNpdHkgb2YgU3QuIExvdWlzIHJlY29yZGVkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcywgdmlvbGF0aW9ucywgYW5kIGFmZmVjdGVkIGVtcGxveWVlcyBpbiBNaXNzb3VyaSwgd2l0aCAxLDQ4NyBjYXNlcywgMjUsMDE5IHZpb2xhdGlvbnMsIGFuZCAyMSw5NTYgYWZmZWN0ZWQgZW1wbG95ZWVzLCByZXNwZWN0aXZlbHkuIE92ZXIgdGhlIHBhc3QgMTAgeWVhcnMsIE1pc3NvdXJpIGhhcyBzZWVuIGEgZGVjbGluZSBpbiB3YWdlIGFuZCBob3VyIHZpb2xhdGlvbnMsIHdpdGggY2FzZXMgZHJvcHBpbmcgZnJvbSAzMTggaW4gMjAyMCB0byBqdXN0IDYgaW4gMjAyNC4gVGhlIGF2ZXJhZ2UgdGltZSB0byByZXNvbHZlIGEgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBjYXNlIGluIE1pc3NvdXJpIGlzIDU4OSBkYXlzLCB3aGlsZSB0aGUgbWVkaWFuIHRpbWUgaXMgNzI4IGRheXPigJRhYm91dCB0d28geWVhcnMuIE9uZSBjYXNlLCBpbnZvbHZpbmcgQmx1ZSBTcHJpbmdzIExhd24gJiBHYXJkZW4sIHRvb2sgNCw4NDAgZGF5c+KAlG1vcmUgdGhhbiAxMyB5ZWFyc+KAlHRvIGNvbXBsZXRlLgoKI1N0b3J5IGlkZWE6CiMxOiBNaXNzb3VyaeKAmXMgZGVjbGluaW5nIHdhZ2UgdGhlZnQgdHJlbmRzCkFuYWx5emluZyB0aGUgZGVjbGluZSBpbiB3YWdlIHRoZWZ0IHZpb2xhdGlvbnMgaW4gTWlzc291cmkgb3ZlciB0aGUgbGFzdCBkZWNhZGUsIGZyb20gMzE4IGNhc2VzIGluIDIwMjAgdG8ganVzdCA2IGluIDIwMjQuIFdoYXTigJlzIGRyaXZpbmcgdGhpcyBwb3NpdGl2ZSB0cmVuZCwgYW5kIHdoYXTigJlzIHN0aWxsIGJlaW5nIG1pc3NlZD8KIzIuIFdhZ2UgdGhlZnQgaW4gU2FpbnQgTG91aXMgdGhlIGhpZ2hlc3QgdmlvbGF0aW9ucyBpbiBNaXNzb3VyaSIKQSBmb2N1cyBvbiBTYWludCBMb3Vpcywgd2hpY2ggcmVjb3JkZWQgMSw0ODcgY2FzZXMgYW5kIDI1LDAxOSB2aW9sYXRpb25zLiBUaGlzIHN0b3J5IHdvdWxkIGV4cGxvcmUgdGhlIGltcGFjdCBvbiB3b3JrZXJzIGFuZCB3aGF0IGlzIGJlaW5nIGRvbmUgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbS4KIzMuIFdoeSBkaWQgdGhlIHdhZ2UgdGhlZnQgY2FzZSBhZ2FpbnN0IEJsdWUgU3ByaW5ncyBMYXduICYgR2FyZGVuIGluIEJsdWUgU3ByaW5ncywgTWlzc291cmksIHRha2UgbW9yZSB0aGFuIDEzIHllYXJzIHRvIGNvbXBsZXRlPwpJbnZlc3RpZ2F0ZSB0aGUgdGhlIHVudXN1YWxseSBsb25nIGR1cmF0aW9uIHRvIGNvbXBsZXRlIHRoZSBjYXNlLiAKCgojTG9hZCBsaWJyYXJ5CmBgYHtyfQoKbGlicmFyeSh0aWR5dmVyc2UpCgpgYGAKI0xvYWQgZGF0YQojUHJvY2VzczogSSBpbXBvcnRlZCB0aGUgZGF0YSB3aXRoIHRoZSBuYW1lICJ3YWdlX3RoZWZ0IiB1c2luZyB0aGUgInJlYWRfY3N2IiBjb2RlLgpgYGB7cn0KCndhZ2VfdGhlZnQgPC0gcmVhZF9jc3YoImRhdGEvd2hkX3doaXNhcmQuY3N2IikKCmBgYAojRGF0YSBhc3Nlc21lbnQ6IAojR2V0IHRvIGtub3cgdGhlIGRhdGEvIERhdGEgZGljdGlvbmFyeToKMS4gSG93IG1hbnkgcm93cz8KI0Fuc3dlcjogMzU3LDI2OSByb3dzCgoyLiBXaGF0IGlzIG9uZSByb3c/LSAKI0Fuc3dlcjogRWFjaCByb3cgcmVwcmVzZW50cyBhIHNpbmdsZSwgY29uY2x1ZGVkIGNvbXBsaWFuY2UgYWN0aW9uIChpbnZlc3RpZ2F0aW9uIG9yIGNhc2UpIGNvbmR1Y3RlZCBieSB0aGUgRGVwYXJ0bWVudCBvZiBMYWJvciBhdCBhIHNwZWNpZmljIGVtcGxveWVyLiAKCjMuIEhvdyBtYW55IGNvbHVtbj8tIAojQW5zd2VyOiBJbml0aWFsbHksIHRoZSBkYXRhc2V0IGNvbnRhaW5lZCAxMTAgY29sdW1ucy4gSG93ZXZlciwgc2V2ZXJhbCBjb2x1bW5zIGNvbnRhaW5lZCBvbmx5IHplcm8gdmFsdWVzIGFuZCBubyBtZWFuaW5nZnVsIGRhdGEsIHNvIEkgZXhjbHVkZWQgdGhvc2UuIEFmdGVyIHJlbW92aW5nIHRoZXNlIGNvbHVtbnMsIHRoZSBudW1iZXIgb2YgY29sdW1ucyB3YXMgcmVkdWNlZCB0byA5NC4gTmV4dCwgSSBleHRyYWN0ZWQgdGhlICdmaW5kaW5nX3N0YXJ0X2RhdGUnIGNvbHVtbiBpbnRvIHNlcGFyYXRlIGNvbHVtbnMgZm9yIERhdGUsIE1vbnRoLCBhbmQgWWVhciB0byBlbmFibGUgbW9yZSBkZXRhaWxlZCB0aW1lLWJhc2VkIGFuYWx5c2lzLiBUaGlzIHRyYW5zZm9ybWF0aW9uIGluY3JlYXNlZCB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgdG8gOTcsIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBuZXcgJ0RhdGUnLCAnTW9udGgnLCBhbmQgJ1llYXInIGNvbHVtbnMuIAoKNC4gV2hhdCBpcyBpbiBldmVyeSBjb2x1bW4/CiNBbnN3ZXI6IFRoZSBkYXRhIHNldCBiZWdpbnMgd2l0aCB0aGUgY2FzZSBJRCwgZm9sbG93ZWQgYnkgdGhlIGVtcGxveWVy4oCZcyBuYW1lLCBhZGRyZXNzLCBhbmQgdGhlIGNhc2Ugc3RhcnQgYW5kIGVuZCBkYXRlcy4gSW4gYWRkaXRpb24gdG8gdGhlc2UgZGVtb2dyYXBoaWMgZGV0YWlscywgdGhlcmUgYXJlIG5lYXJseSAxMDAgY29sdW1ucyBjb250YWluaW5nIGRhdGEgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIGJhY2sgd2FnZSBhbW91bnRzLCBhbmQgZmluZXMuIEZyb20gdGhlc2UsIHRoZSAyMCBtb3N0IHJlbGV2YW50IGluZGljYXRvcnMgd2lsbCBiZSBzZWxlY3RlZCBmb3IgYW5hbHlzaXMuCgojRXhjbHVkZSB0aGUgY29sdW1ucyB0aGF0IGNvbnRhaW4gb25seSB6ZXJvcyBpbiBhbGwgcm93cy4KCiNQcm9jZXNzOiBJIHVzZWQgdGhlIHNlbGVjdCgpIGZ1bmN0aW9uIHRvIGNob29zZSB3aGljaCBjb2x1bW5zIHRvIGtlZXAsIGNvbWJpbmVkIHdpdGggd2hlcmUofiFhbGwoLiA9PSAwKSkgdG8gZmlsdGVyIG91dCBjb2x1bW5zIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIHplcm8uIFRoZSBjb2RlIH4hYWxsKC4gPT0gMCksIG1lYW5zICJrZWVwIGNvbHVtbnMgd2hlcmUgbm90IGFsbCB2YWx1ZXMgYXJlIHplcm8iLiBJdCByZW1vdmVzIG9ubHkgY29sdW1ucyB3aGVyZSBldmVyeSBzaW5nbGUgdmFsdWUgaXMgemVyby4gVGhlIHJlc3VsdCB3YXMgc3RvcmVkIGJhY2sgaW4gdGhlIG9yaWdpbmFsIGRhdGFzZXQgY2FsbGVkIE1PX3dhZ2VfdGhlZnQuCmBgYHtyfQoKY2xlYW5lZF93YWdlX3RoZWZ0IDwtIHdhZ2VfdGhlZnQgJT4lCiAgc2VsZWN0KHdoZXJlKH4hYWxsKC4gPT0gMCkpKQoKYGBgCgoKI1Byb2Nlc3M6IEF0IHRoaXMgcG9pbnQgaW4gbXkgYW5hbHlzaXMsIEkgd2FudGVkIHRvIHNlcGFyYXRlIHRoZSBtb250aCBhbmQgeWVhciBmcm9tIHRoZSBmaW5kaW5nc19zdGFydF9kYXRlIGNvbHVtbiB0byBwZXJmb3JtIHRpbWUtYmFzZWQgYW5hbHlzaXMuIEluaXRpYWxseSwgSSB1c2VkIHRoZSBtZHkoKSBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kaW5nc19zdGFydF9kYXRlIGludG8gc2VwYXJhdGUgRGF0ZSwgTW9udGgsIGFuZCBZZWFyIGNvbXBvbmVudHMuIEhvd2V2ZXIsIEkgcmVhbGl6ZWQgdGhhdCB0aGUgYWN0dWFsIGRhdGUgZm9ybWF0IHdhcyAieW1kIiwgc28gSSBzd2l0Y2hlZCB0byB1c2luZyB0aGUgeW1kKCkgZnVuY3Rpb24gdG8gcHJvcGVybHkgZXh0cmFjdCB0aGUgTW9udGggYW5kIFllYXIuIFdoaWxlIHRoZSBmdW5jdGlvbiBzdWNjZXNzZnVsbHkgc2VwYXJhdGVkIHRoZSBkYXRhLCBpdCByZXR1cm5lZCBhIHdhcm5pbmcgbWVzc2FnZS4gQWZ0ZXIgZG9pbmcgc29tZSByZXNlYXJjaCwgSSBmb3VuZCB0aGF0IGFkZGluZyB0aGUgYXJndW1lbnQgcXVpZXQgPSBUUlVFIHdvdWxkIHN1cHByZXNzIHRoZSB3YXJuaW5nLiBPbmNlIEkgaW5jbHVkZWQgdGhpcywgSSB3YXMgYWJsZSB0byBzZXBhcmF0ZSB0aGUgY29sdW1uIGNsZWFubHkgd2l0aG91dCBhbnkgZnVydGhlciB3YXJuaW5ncy5XaXRoIHRoZXNlIHVwZGF0ZXMsIEkgY3JlYXRlZCBhIG5ldyBkYXRhc2V0IGNhbGxlZCBVU193YWdlX3RoZWZ0LkkgY2hvc2UgdG8gYW5hbHl6ZSB0aGUgZmluZGluZ3Nfc3RhcnRfZGF0ZSBiZWNhdXNlIGl0IHJlcHJlc2VudHMgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBXYWdlIGFuZCBIb3VyIERpdmlzaW9uIGZpcnN0IGRldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBhIHZpb2xhdGlvbiBvciBubyB2aW9sYXRpb24gaW4gYSBjYXNlLiBUaGlzIGRhdGUgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmluZGluZ3MgcGhhc2UsIHdoZXJlIGluaXRpYWwgY29uY2x1c2lvbnMgYXJlIGRyYXduIGJhc2VkIG9uIGF2YWlsYWJsZSBldmlkZW5jZSBhbmQgYW5hbHlzaXMuCmBgYHtyfQoKVVNfd2FnZV90aGVmdCA8LSBjbGVhbmVkX3dhZ2VfdGhlZnQgJT4lCm11dGF0ZSAoRGF0ZSA9IG1keSAoZmluZGluZ3Nfc3RhcnRfZGF0ZSksIE1vbnRoID0gbW9udGggKGZpbmRpbmdzX3N0YXJ0X2RhdGUpLCBZZWFyID0geWVhciAoZmluZGluZ3Nfc3RhcnRfZGF0ZSkpCgpVU193YWdlX3RoZWZ0IDwtIGNsZWFuZWRfd2FnZV90aGVmdCAlPiUKbXV0YXRlIChEYXRlID0geW1kIChmaW5kaW5nc19zdGFydF9kYXRlKSwgTW9udGggPSBtb250aCAoZmluZGluZ3Nfc3RhcnRfZGF0ZSksIFllYXIgPSB5ZWFyIChmaW5kaW5nc19zdGFydF9kYXRlKSkKCiNGaW5hbCBjb2RlOiAKVVNfd2FnZV90aGVmdCA8LSBjbGVhbmVkX3dhZ2VfdGhlZnQgJT4lCiAgbXV0YXRlKAogICAgRGF0ZSA9IHltZChmaW5kaW5nc19zdGFydF9kYXRlLCBxdWlldCA9IFRSVUUpLAogICAgTW9udGggPSBtb250aCh5bWQoZmluZGluZ3Nfc3RhcnRfZGF0ZSwgcXVpZXQgPSBUUlVFKSksCiAgICBZZWFyID0geWVhcih5bWQoZmluZGluZ3Nfc3RhcnRfZGF0ZSwgcXVpZXQgPSBUUlVFKSkpCgpgYGAKCjUuV2hhdCBhcmUgdGhlIGRhdGUgYm91bmRhcmllcyBvZiB0aGUgZGF0YT8gCiNBbnN3ZXI6IEFjY29yZGluZyB0byB0aGUgZGF0YXNldCwgdGhlIGRhdGUgcmFuZ2Ugc3RhcnRzIGZyb20gMTkwMC0wMS0wNyBhbmQgZW5kcyBvbiAzNTkwLTAxLTAxLCB3aGljaCBib3RoIGFwcGVhciB0byBiZSB0eXBvcy4gQWZ0ZXIgbWFudWFsbHkgY2hlY2tpbmcgYnkgYXJyYW5naW5nIHRoZSBkYXRlcywgSSBmb3VuZCB0aGF0IDE4IHJvd3MgY29udGFpbiBpbmNvcnJlY3Qgb3IgbWlzbGVhZGluZyBkYXRlIGVudHJpZXMuIEFsbCBvdGhlciBkYXRlcyBzZWVtIHRvIGJlIGFjY3VyYXRlLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lIAogIG11dGF0ZShEYXRlID0gbWR5IChEYXRlKSwgbmEucm0gPSBUUlVFKSAlPiUgCiAgc3VtbWFyaXNlKHJhbmdlKERhdGUpKQoKVVNfd2FnZV90aGVmdCAlPiUgCiAgbXV0YXRlKERhdGUgPSB5bWQgKERhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKHJhbmdlKERhdGUpKQoKI0ZpbmFsIGNvZGU6CnJhbmdlKFVTX3dhZ2VfdGhlZnQkRGF0ZSwgbmEucm09VCkKYGBgCgo2LiBJbiB0b3RhbCwgaG93IG1hbnkgeWVhcnMgYW5kIG1vbnRocyBvZiBkYXRhIGFyZSBpbiB0aGlzIGRhdGEgc2V0PwojQW5zd2VyOiBJIGFzc3VtZSB0aGVyZSBhcmUgc29tZSBlcnJvcnMgaW4gdGhlIGRhdGUgZGF0YS4gQWNjb3JkaW5nIHRvIHRoZSBkYXRhIHNvdXJjZSwgdGhlIHBlcmlvZCBzdGFydHMgZnJvbSAxOTg1LiBIb3dldmVyLCBpdCBhbHNvIGluY2x1ZGVzIGRhdGEgZnJvbSB0aGUgMTkwMHMgYW5kIDE5NjBzLiBBZGRpdGlvbmFsbHksIHRoZXJlIGFyZSAyMSBjYXNlcyB3aXRob3V0IGEgZGF0ZS4gRGVzcGl0ZSB0aGVzZSBlcnJvcnMsIEkgY29uc2lkZXIgdGhlbSBtaW5pbWFsIGFuZCBoYXZlIGFuYWx5emVkIHRoZSBkYXRhIGFjY29yZGluZ2x5LiBUaGUgZGF0YXNldCBzcGFucyBhIHRvdGFsIG9mIDQzNiBtb250aHMsIGZyb20gSmFudWFyeSAxOTkwIHRvIE1hcmNoIDIwMjUuCgojUHJvY2VzczogVG8gZmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIG1vbnRocyBhbmQgeWVhcnMsIEkgdXNlZCB0aGUgY291bnQgZnVuY3Rpb24sIHdoaWNoIHByb3ZpZGVzIG1vbnRoLXdpc2UgZGF0YSBmb3IgZWFjaCB5ZWFyLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lIAogIGNvdW50KFllYXIsIE1vbnRoKQoKYGBgCgo3LiBBcmUgdGhlcmUgYW55IGJsYW5rIHJvd3MgaW4gdGhlICJjYXNlX2lkIiBjb2x1bW4/CiNBbnN3ZXI6IE5vLCB0aGVyZSBhcmUgbm8gYmxhbmsgb3IgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICJjYXNlX2lkIiBjb2x1bW4uIEVhY2ggcm93IGluIHRoZSBkYXRhc2V0IGNvbnRhaW5zIGEgdmFsaWQgY2FzZSBJRC4KCiNQcm9jZXNzOiBUbyBlbnN1cmUgZGF0YSBjb21wbGV0ZW5lc3MgaW4gdGhlIG1haW4gY29sdW1uIG9mIHRoZSBkYXRhc2V0LCBJIGNoZWNrZWQgZm9yIGFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgImNhc2VfaWQiIGNvbHVtbiB1c2luZyB0aGUgaXMubmEoKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBoZWxwcyBpZGVudGlmeSBOQSB2YWx1ZXMgKGkuZS4sIG1pc3NpbmcgZGF0YSkuIEFmdGVyIGFwcGx5aW5nIHRoZSBjaGVjaywgSSBjb25maXJtZWQgdGhhdCBubyByb3dzIGhhdmUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICJjYXNlX2lkIiBjb2x1bW4uCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoaXMubmEoY2FzZV9pZCkgfCBjYXNlX2lkID09ICIiKQoKYGBgCgo4LiBBcmUgdGhlcmUgYW55IGJsYW5rIHJvd3MgaW4gdGhlICJ0cmFkZV9ubSIgKEVtcGxveWVyIG5hbWUpIGNvbHVtbj8KI0Fuc3dlcjogTm8sIHRoZSBlbXBsb3llci9idXNpbmVzcyBuYW1lIGlzIG1lbnRpb25lZCBpbiBhbGwgcm93cy4gVGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIHRoZSAidHJhZGVfbm0iIGNvbHVtbi4KCiNQcm9jZXNzOkkgdXNlZCB0aGUgc2FtZSBpcy5uYSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgYW55IGVtcGxveWVyIG5hbWVzIHdlcmUgbWlzc2luZyBpbiB0aGUgInRyYWRlX25tIiBjb2x1bW4uIFRoZSByZXN1bHQgc2hvd2VkIDAgKHplcm8pIG1pc3Npbmcgcm93cywgd2hpY2ggbWVhbnMgbm8gZGF0YSBpcyBtaXNzaW5nIGluIHRoaXMgY29sdW1uIGVpdGhlci4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihpcy5uYSh0cmFkZV9ubSkgfCB0cmFkZV9ubSA9PSAiIikKCmBgYAoKOS4gQXJlIHRoZXJlIGFueSBibGFuayByb3dzIGluIHRoZSAiZGF0ZSIgY29sdW1uPwojQW5zd2VyOiBZZXMsIHRoZXJlIGFyZSAyMSByb3dzIHdoZXJlIHRoZSBmaW5kaW5nIHN0YXJ0IGRhdGUgaXMgbm90IG1lbnRpb25lZC4KCiNQcm9jZXNzOkkgdXNlZCB0aGUgc2FtZSBpcy5uYSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgYW55IHZhbHVlcyB3ZXJlIG1pc3NpbmcgaW4gdGhlICJkYXRlIiBjb2x1bW4uIFRoZSByZXN1bHQgc2hvd2VkIDIxIG1pc3Npbmcgcm93cywgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGFydCBkYXRlIGlzIG5vdCBwcm92aWRlZCBpbiB0aG9zZSBlbnRyaWVzLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKGlzLm5hKERhdGUpIHwgRGF0ZSA9PSAiIikKCmBgYAoKMTAuIEFyZSB0aGVyZSBhbnkgYmxhbmsgcm93cyBpbiB0aGUgInN0X2NkIiAoU3RhdGUgbmFtZSkgY29sdW1uPwojQW5zd2VyOiBZZXMsIHRoZXJlIGFyZSAzIHJvd3Mgd2hlcmUgdGhlIHN0YXRlIG5hbWUgb2YgdGhlIGVtcGxveWVyL2J1c2luZXNzIGlzIG5vdCBtZW50aW9uZWQuCgojUHJvY2VzczpJIHVzZWQgdGhlIHNhbWUgaXMubmEoKSBmdW5jdGlvbiB0byBjaGVjayBmb3IgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICJzdF9jZCIgY29sdW1uLiBUaGUgcmVzdWx0IHNob3dlZCAzIGJsYW5rIHJvd3MsIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdGUgbmFtZSBpcyBub3QgcHJvdmlkZWQgaW4gdGhvc2Ugcm93cy4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihpcy5uYShzdF9jZCkgfCBzdF9jZCA9PSAiIikKCmBgYAoKMTEuIEhvdyBtYW55IHVuaXF1ZSBjYXNlcyBhcmUgaW4gdGhlIGRhdGE/CiNBbnN3ZXI6IDM1NywyNjkuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBjYXNlIElEIG51bWJlcnMgaW4gdGhlIGRhdGFzZXTigJRhbGwgY2FzZSBJRHMgYXJlIHVuaXF1ZS4KCiNQcm9jZXNzOiBJIHdhbnRlZCB0byBjaGVjayBob3cgbWFueSB1bmlxdWUgY2FzZV9pZCBleGlzdCBhbmQgd2hldGhlciBhbnkgY2FzZSBJRHMgYXJlIHJlcGVhdGVkIG9yIGR1cGxpY2F0ZWQuIEZvciB0aGF0LCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIG5fZGlzdGluY3QoKSBjb2RlLiBUaGUgcmVzdWx0IHJldHVybmVkIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIGluIHRoZSBkYXRhc2V0LCB3aGljaCBjb25maXJtcyB0aGF0IGFsbCBjYXNlX2lkIHZhbHVlcyBhcmUgdW5pcXVlLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgc3VtbWFyaXNlKGNhc2VfaWQgPSBuX2Rpc3RpbmN0KGNhc2VfaWQpKQoKYGBgCgoxMi4gSG93IG1hbnkgdW5pcXVlIGVtcGxveWVycyBhcmUgaW4gdGhlIGRhdGE/CiNBbnN3ZXI6IDI5OCw3NTEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgbWFueSBlbXBsb3llcnMgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGZvciB3YWdlIHZpb2xhdGlvbnMgaW4gZGlmZmVyZW50IHN0YXRlcyBhY3Jvc3MgdGhlIFUuUy4KCiNQcm9jZXNzOkkgd2FudGVkIHRvIGNoZWNrIGhvdyBtYW55IHVuaXF1ZSBlbXBsb3llcnMgZXhpc3QgaW4gdGhlIGRhdGFzZXQuIEZvciB0aGF0LCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIG5fZGlzdGluY3QoKSBjb2RlLCBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBxdWVzdGlvbi4gCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBzdW1tYXJpc2UoVW5pcXVlX0VtcGxveWVyID0gbl9kaXN0aW5jdCh0cmFkZV9ubSkpCgpgYGAKCiNEYXRhIGFuYWx5c2lzOgpRMS4gV2hpY2ggc3RhdGUgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBhY2NvcmRpbmcgdG8gV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBEYXRhPyBXaGVyZSBkb2VzIE1pc3NvdXJpIHJhbmsgb24gdGhlIGxpc3Q/CiNBbnN3ZXI6IFRleGFzIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIsIHdpdGggNDUsOTgzIGluZGl2aWR1YWwgY2FzZXMgb2YgV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbnMuIE1pc3NvdXJpIHJhbmtzIDEzdGggb24gdGhlIGxpc3QsIHdpdGggNyw4NzEgdmlvbGF0aW9uIGNhc2VzLgoKI1Byb2Nlc3M6IFRvIGlkZW50aWZ5IHRoZSBzdGF0ZS13aXNlIHdhZ2UgdGhlZnQgY2FzZXMsIEkgdXNlZCB0aGUgY291bnQoKSBmdW5jdGlvbi4gU2luY2UgZWFjaCBjYXNlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGluZGl2aWR1YWwgcm93LCBhbmQgZWFjaCByb3cgaW5jbHVkZXMgYSBzcGVjaWZpYyBzdGF0ZSBuYW1lLCBJIGNvdW50ZWQgdGhlIHN0YXRlIHVzaW5nIHRoZSBjb3VudCgpIGZ1bmN0aW9uLiBUaGVuLCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gZmluZCB0aGUgc3RhdGUgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBpbiB0aGUgVS5TLiAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGNvdW50KHN0X2NkKSAlPiUKICBhcnJhbmdlIChkZXNjIChuKSkKCmBgYAoKI0hvd2V2ZXIsIHRoZSBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIGNvZGUgaXMgdGhhdCBpdCBkb2VzIG5vdCByZWZsZWN0IHRoZSBhY3R1YWwgc2NlbmFyaW8gb2Ygd2FnZSB0aGVmdCBpbiBlYWNoIHN0YXRlLiBUaGlzIGlzIGJlY2F1c2UgZXZlcnkgc3RhdGUgaGFzIGl0cyBvd24gZGVtb2dyYXBoaWMgZGlmZmVyZW5jZXMsIHN1Y2ggYXMgcG9wdWxhdGlvbiBhbmQgYXJlYSBzaXplLiBGb3IgZXhhbXBsZSwgYSBzdGF0ZSB3aXRoIGEgbGFyZ2VyIHBvcHVsYXRpb24gaXMgbGlrZWx5IHRvIGhhdmUgbW9yZSBidXNpbmVzc2VzLCB3aGljaCBjb3VsZCBuYXR1cmFsbHkgcmVzdWx0IGluIGEgaGlnaGVyIG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIGNvbXBhcmVkIHRvIGEgc21hbGxlciBzdGF0ZS4gVGhlcmVmb3JlLCB0byBtYWtlIGEgZmFpciBjb21wYXJpc29uLCBJIHdpbGwgZXhhbWluZSB3aGljaCBzdGF0ZSBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgY2FzZXMgcGVyIDEwLDAwMCBwZW9wbGUsIGFjY29yZGluZyB0byBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgQWN0aW9uIGRhdGEuCgpRMi4gV2hpY2ggc3RhdGUgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIHBlciAxMCwwMDAgcGVvcGxlLCBhY2NvcmRpbmcgdG8gV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBkYXRhLiBXaGVyZSBkb2VzIE1pc3NvdXJpIHJhbmsgb24gdGhlIGxpc3Q/CiNBbnN3ZXI6V2VzdCBWaXJnaW5pYSwgMjAgY2FzZXMgaW4gcGVyIDEwLDAwMCBwZW9wbGUuIE1pc3NvdXJpIHJhbmtzIDE4dGggb24gdGhlIGxpc3QsIHdpdGggYXJvdW5kIDEzIHZpb2xhdGlvbiBjYXNlcyBpbiBwZXIgMTAsMDAwIHBlb3BsZSAuIAoKI1Byb2Nlc3M6IFRvIGdldCB0aGUgYW5zd2VyIGZvciB0aGUgc3RhdGUgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBwZXIgMTAsMDAwIHBlb3BsZSwgSSBuZWVkZWQgcG9wdWxhdGlvbiBkYXRhIGZvciBlYWNoIFUuUy4gc3RhdGUuIEZvciB0aGlzLCBJIHVzZWQgdGhlIHRpZHljZW5zdXMgbGlicmFyeS4gU28sIHRoZSBmaXJzdCBzdGVwIHdhcyB0byBsb2FkIHRoYXQgbGlicmFyeS4gTmV4dCwgSSB1c2VkIHRoZSBnZXRfYWNzKCkgZnVuY3Rpb24sIGFzIEkgd2FzIGFscmVhZHkgZmFtaWxpYXIgd2l0aCBpdCBmcm9tIGEgd2Vla2x5IGNsYXNzIGFzc2lnbm1lbnQuIEkgdXNlZCB0aGUgdmFyaWFibGUgQjAxMDAzXzAwMSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgdG90YWwgcG9wdWxhdGlvbi4gU2luY2UgSSBuZWVkZWQgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCBzdGF0ZSwgSSBzZXQgZ2VvZ3JhcGh5ID0gInN0YXRlIiwgYW5kIHNlbGVjdGVkIHRoZSB5ZWFyIDIwMjMsIGFzIGl0J3MgdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGZvciB0aGF0IHZhcmlhYmxlLiBUaGlzIGNvZGUgZ2F2ZSBtZSBhIGRhdGFzZXQgY2FsbGVkIFVTX3N0YXRlX3BvcHVsYXRpb24uIE5vdywgdG8gY2FsY3VsYXRlIHdhZ2UgdGhlZnQgY2FzZXMgcGVyIDEwLDAwMCBwZW9wbGUsIEkgc3RhcnRlZCBieSBjb3VudGluZyBob3cgbWFueSB0aW1lcyBlYWNoIHN0YXRlIGFwcGVhcnMgaW4gdGhlIHdhZ2UgdGhlZnQgZGF0YXNldCAoc3BlY2lmaWNhbGx5IGluIHRoZSBzdF9jZCBjb2x1bW4pLiBUaGlzIGNvdW50IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBjYXNlcyBpbiBlYWNoIHN0YXRlLiBOZXh0LCBJIHVzZWQgbXV0YXRlKCkgdG8gc3RhbmRhcmRpemUgc3RhdGUgbmFtZXMgaW4gYm90aCBkYXRhc2V0cy4gSW4gdGhlIFVTX3N0YXRlX3BvcHVsYXRpb24gZGF0YXNldCwgc3RhdGVzIGFyZSBsaXN0ZWQgYnkgdGhlaXIgZnVsbCBuYW1lcywgd2hpbGUgaW4gdGhlIFVTX3dhZ2VfdGhlZnQgZGF0YXNldCwgdGhleSBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgYWJicmV2aWF0aW9ucyAoZS5nLiwgIkRDIikuIFRvIG1hdGNoIHRoZW0sIEkgdXNlZCB0aGUgc3RhdGUubmFtZVttYXRjaCgpXSBmdW5jdGlvbiBhbmQgaW5jbHVkZWQgaXMubmEgdG8gYXZvaWQgcG90ZW50aWFsIGVycm9ycyBpbiBjYXNlIG9mIG1pc3NpbmcgbWF0Y2hlcy4gQWZ0ZXIgc3RhbmRhcmRpemluZyBuYW1lcywgSSBqb2luZWQgdGhlIHR3byBkYXRhc2V0cyB1c2luZyBhIGxlZnQgam9pbiwgYnJpbmdpbmcgaW4gYm90aCB0aGUgc3RhdGUgbmFtZSBhbmQgcG9wdWxhdGlvbiBlc3RpbWF0ZS4gVGhlbiwgSSB1c2VkIG11dGF0ZSgpIGFnYWluIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNhc2VzIHBlciAxMCwwMDAgcGVvcGxlIGJ5IGRpdmlkaW5nIHRoZSBjYXNlIGNvdW50IGJ5IHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIGVhY2ggc3RhdGUgYW5kIG11bHRpcGx5aW5nIHRoZSByZXN1bHQgYnkgMTAsMDAwLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgY2FzZXNfcGVyXzEwSyB2YWx1ZS4KYGBge3J9CiNsb2FkIHRoZSBsaWJyYXJ5CgpsaWJyYXJ5KHRpZHljZW5zdXMpCgpVU19zdGF0ZV9wb3B1bGF0aW9uIDwtIGdldF9hY3MoCiAgZ2VvZ3JhcGh5ID0gInN0YXRlIiwKICB2YXJpYWJsZXMgPSAiQjAxMDAzXzAwMSIsIAogIHllYXIgPSAyMDIzKQoKVVNfd2FnZV90aGVmdCAlPiUKICBjb3VudChzdF9jZCkgJT4lCiAgbXV0YXRlKHN0YXRlID0gc3RhdGUubmFtZVttYXRjaChzdF9jZCwgc3RhdGUuYWJiKV0sCiAgICBzdGF0ZSA9IGNhc2Vfd2hlbihzdF9jZCA9PSAiREMiIH4gIkRpc3RyaWN0IG9mIENvbHVtYmlhIiwKICAgICAgIWlzLm5hKHN0YXRlKSB+IHN0YXRlLAogICAgICBUUlVFIH4gc3RfY2QpKSAlPiUKICBsZWZ0X2pvaW4oVVNfc3RhdGVfcG9wdWxhdGlvbiAlPiUgc2VsZWN0KE5BTUUsIGVzdGltYXRlKSwgYnkgPSBjKCJzdGF0ZSIgPSAiTkFNRSIpKSAlPiUKICBtdXRhdGUoY2FzZXNfcGVyXzEwayA9IChuIC8gZXN0aW1hdGUpICogMTAwMDApICU+JQogIGFycmFuZ2UoZGVzYyhjYXNlc19wZXJfMTBrKSkKCmBgYAoKClEzLiBXaGljaCBzdGF0ZSBoYXMgdGhlIGhpZ2hlc3QgdG90YWwgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgdmlvbGF0aW9ucyBwZXIgMTAsMDAwIHBlb3BsZSwgYWNjb3JkaW5nIHRvIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YS4gV2hlcmUgZG9lcyBNaXNzb3VyaSByYW5rIG9uIHRoZSBsaXN0PwojQW5zd2VyOiAgQXJrYW5zYXMgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgdmlvbGF0aW9ucyBwZXIgMTAsMDAwIHBlb3BsZSwgd2l0aCAyLDkxMCBjYXNlcy4gTWlzc291cmkgcmFua3MgNDZ0aCBvbiB0aGUgbGlzdCwgd2l0aCAyMTIgdmlvbGF0aW9ucyBwZXIgMTAsMDAwIHBlb3BsZS4KCiNQcm9jZXNzOiBUbyBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgSSBmb2xsb3dlZCBhIHByb2Nlc3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBvbmUsIHNpbmNlIHRoZSBnb2FsIHdhcyBhZ2FpbiB0byBjYWxjdWxhdGUgc3RhdGUtbGV2ZWwgdmlvbGF0aW9ucyBwZXIgMTAsMDAwIHBlb3BsZS4gSG93ZXZlciwgdGhpcyB0aW1lIEkgbmVlZGVkIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyByYXRoZXIgdGhhbiBqdXN0IHRoZSBjb3VudCBvZiBlbnRyaWVzLkZpcnN0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgc3RhdGUgdXNpbmcgZ3JvdXBfYnkoc3RhdGUpLCBhbmQgdGhlbiB1c2VkIHRoZSBzdW1tYXJpemUoKSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIGZvciBlYWNoIHN0YXRlLiBOZXh0LCBJIGZvbGxvd2VkIHRoZSBzYW1lIHByb2NlZHVyZSB0byBtZXJnZSB0aGUgcG9wdWxhdGlvbiBkYXRhIHVzaW5nIGEgbGVmdCBqb2luLCBlbnN1cmluZyB0aGUgcG9wdWxhdGlvbiBlc3RpbWF0ZXMgd2VyZSBtYXRjaGVkIHdpdGggZWFjaCBzdGF0ZSdzIHZpb2xhdGlvbiBkYXRhLiBUbyBjYWxjdWxhdGUgdmlvbGF0aW9ucyBwZXIgMTAsMDAwIHBlb3BsZSwgSSB1c2VkIHRoZSBtdXRhdGUoKSBmdW5jdGlvbi4gSSBkaXZpZGVkIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBieSB0aGUgcG9wdWxhdGlvbiBlc3RpbWF0ZSBmb3IgZWFjaCBzdGF0ZSBhbmQgdGhlbiBtdWx0aXBsaWVkIHRoZSByZXN1bHQgYnkgMTAsMDAwLiBGaW5hbGx5LCBJIHVzZWQgYXJyYW5nZShkZXNjKHZpb2xhdGlvbnNfcGVyXzEwSykpIHRvIHNvcnQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgdmlvbGF0aW9ucyBwZXIgMTAsMDAwIHBlb3BsZS4gCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShzdF9jZCkgJT4lCiAgc3VtbWFyaXNlKFRvdGFsX1Zpb2xhdGlvbiA9IHN1bShjYXNlX3Zpb2x0bl9jbnQpKSAlPiUKICBtdXRhdGUoc3RhdGUgPSBzdGF0ZS5uYW1lW21hdGNoKHN0X2NkLCBzdGF0ZS5hYmIpXSwKICBzdGF0ZSA9IGNhc2Vfd2hlbihzdF9jZCA9PSAiREMiIH4gIkRpc3RyaWN0IG9mIENvbHVtYmlhIiwhaXMubmEoc3RhdGUpIH4gc3RhdGUsIFRSVUUgfiBzdF9jZCkpICU+JQogIGxlZnRfam9pbihVU19zdGF0ZV9wb3B1bGF0aW9uICU+JSBzZWxlY3QoTkFNRSwgZXN0aW1hdGUpLCBieSA9IGMoInN0YXRlIiA9ICJOQU1FIikpICU+JQogIG11dGF0ZSh2aW9sYXRpb25zX3Blcl8xMGsgPSAoVG90YWxfVmlvbGF0aW9uIC8gZXN0aW1hdGUpICogMTAwMDApICU+JQogIGFycmFuZ2UoZGVzYyh2aW9sYXRpb25zX3Blcl8xMGspKQoKYGBgCgpRNC4gV2hpY2ggY29tcGFueSBhZmZlY3RlZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZW1wbG95ZWVzIG9uIGF2ZXJhZ2UgaW4gZWFjaCB3YWdlIHRoZWZ0IGNhc2UgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGFjY29yZGluZyB0byBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgQWN0aW9uIERhdGE/CiNBbnN3ZXI6IFdhbG1hcnQuIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDEwNCBjYXNlcyBhY3Jvc3MgYWxsIHN0YXRlcyBpbnZvbHZpbmcgV2FsbWFydCwgd2l0aCBhbiBhdmVyYWdlIG9mIDg0OCBlbXBsb3llZXMgYWZmZWN0ZWQgcGVyIGNhc2UuIAoKI1Byb2Nlc3M6IFRvIGZpbmQgdGhlIGFuc3dlciwgSSBmaXJzdCBncm91cGVkIHRoZSBkYXRhIGJ5IGVtcGxveWVyICh0cmFkZV9ubSkuIFRoZW4sIEkgdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24uIEkgY291bnRlZCB0aGUgdG90YWwgbnVtYmVyIG9mIGNhc2VzIHVzaW5nIG4oKSwgYW5kIGFkZGVkIHVwIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgZW1wbG95ZWVzIHVzaW5nIHRoZSBzdW0oKSBmdW5jdGlvbiBvbiBlZV92b2lsdGRfY250LCB3aGljaCBzaG93cyBob3cgbWFueSBlbXBsb3llZXMgd2VyZSBhZmZlY3RlZC4gQWZ0ZXIgdGhhdCwgSSBnZXQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGFmZmVjdGVkIGVtcGxveWVlcyBwZXIgY2FzZSBieSBkaXZpZGluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGFmZmVjdGVkIGVtcGxveWVlcyBieSB0aGUgbnVtYmVyIG9mIGNhc2VzLiBCdXQgdG8ga2VlcCB0aGUgcmVzdWx0cyBmYWlyLCBJIGRpZG7igJl0IGluY2x1ZGUgY29tcGFuaWVzIHRoYXQgaGFkIHZlcnkgZmV3IGNhc2VzLiBTb21ldGltZXMgYSBjb21wYW55IHdpdGgganVzdCBvbmUgY2FzZSBhbmQgbWFueSBhZmZlY3RlZCB3b3JrZXJzIGNvdWxkIGVuZCB1cCBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0LiBTbywgSSBvbmx5IGluY2x1ZGVkIGNvbXBhbmllcyB3aXRoIG1vcmUgdGhhbiA1MCBjYXNlcyBpbiB0aGUgVS5TLiBGaW5hbGx5LCBJIHNvcnRlZCB0aGUgZGF0YSBmcm9tIGhpZ2hlc3QgdG8gbG93ZXN0IGJhc2VkIG9uIHRoZSBhdmVyYWdlIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMgcGVyIGNhc2UgdG8gZmluZCBvdXQgd2hpY2ggY29tcGFueSBoYWQgdGhlIG1vc3Qgb24gYXZlcmFnZS4gIApgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcml6ZShjYXNlX2NvdW50ID0gbigpLAogICAgdG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzID0gc3VtKGVlX3Zpb2x0ZF9jbnQpLAogICAgYXZnX2FmZmVjdGVkX3Blcl9jYXNlID0gdG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzIC8gY2FzZV9jb3VudCkgJT4lCiAgZmlsdGVyKGNhc2VfY291bnQgPj0gNTApICU+JSAKICAgIGFycmFuZ2UoZGVzYyhhdmdfYWZmZWN0ZWRfcGVyX2Nhc2UpKQoKYGBgCgoKUTUuIFdoaWNoIGNvbXBhbnkgb3IgYnVzaW5lc3MgY29tbWl0dGVkIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgdmlvbGF0aW9ucyBpbiB0aGUgVW5pdGVkIFN0YXRlcywgYWNjb3JkaW5nIHRvIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gRGF0YT8KI0Fuc3dlcjogRG9sbGFyIEdlbmVyYWwgaGFkIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMuIFRoZSBjb21wYW55IHdhcyBpbnZvbHZlZCBpbiA4NCBjYXNlcyB3aXRoIGEgdG90YWwgb2YgMTQxLDEzOSBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9ucy4gVGhpcyBtZWFucywgb24gYXZlcmFnZSwgRG9sbGFyIEdlbmVyYWwgY29tbWl0dGVkIGFib3V0IDEsNjgwIHZpb2xhdGlvbnMgcGVyIGNhc2UuCgojUHJvY2VzczogUHJvY2VzczogU2luY2UgdGhlIG51bWJlciBvZiBjYXNlcyBhbmQgdGhlIG51bWJlciBvZiB2aW9sYXRpb25zIGFyZSBkaWZmZXJlbnQsIEkgd2FudGVkIHRvIGZpbmQgb3V0IHdoaWNoIGVtcGxveWVycyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHZpb2xhdGlvbnMuIEJ1dCBqdXN0IGxvb2tpbmcgYXQgdGhlIHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIGRvZXNu4oCZdCBzaG93IHRoZSBmdWxsIHBpY3R1cmUuIEZvciBleGFtcGxlLCBXZWxscyBGYXJnbyBCYW5rLCBOLkEuIGhhZCB0aGUgaGlnaGVzdCB0b3RhbCB2aW9sYXRpb25zICg1MzAsMDAyKSwgYnV0IGl0IGNhbWUgZnJvbSBvbmx5IG9uZSBjYXNlLiBTbywgSSBkZWNpZGVkIHRvIGxvb2sgYXQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UuIFRvIGRvIHRoaXMsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSB0cmFkZV9ubSAoZW1wbG95ZXIgbmFtZSksIHRoZW4gdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyBhbmQgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgKGNhc2VfdmlvbHRuX2NudCkuIEFmdGVyIHRoYXQsIEkgY2FsY3VsYXRlZCB0aGUgYXZlcmFnZSB2aW9sYXRpb25zIHBlciBjYXNlIGJ5IGRpdmlkaW5nIHRvdGFsIHZpb2xhdGlvbnMgYnkgdG90YWwgY2FzZXMuIEZpbmFsbHksIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgYXZlcmFnZSB2aW9sYXRpb25zIHBlciBjYXNlLiBMaWtlIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgdG8ga2VlcCB0aGUgcmVzdWx0cyBmYWlyLCBJIGRpZG7igJl0IGluY2x1ZGUgY29tcGFuaWVzIHRoYXQgaGFkIHZlcnkgZmV3IGNhc2VzLiBTb21ldGltZXMsIGEgY29tcGFueSB3aXRoIGp1c3Qgb25lIGNhc2UgYW5kIG1hbnkgdmlvbGF0aW9ucyBjb3VsZCBlbmQgdXAgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdCwgd2hpY2ggd291bGRu4oCZdCBzaG93IHRoZSByZWFsIHBpY3R1cmUuIFNvLCBJIG9ubHkgaW5jbHVkZWQgY29tcGFuaWVzIHRoYXQgaGFkIG1vcmUgdGhhbiA1MCBjYXNlcyBhY3Jvc3MgdGhlIFUuUy4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKGNhc2VfY291bnQgPSBuKCksIAogICAgICAgICAgICAgVG90YWxfVmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpKSAlPiUKICBhcnJhbmdlIChkZXNjIChUb3RhbF9WaW9sYXRpb24pKQoKI0ZpbmFsIGNvZGU6ClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcmlzZSAoY2FzZV9jb3VudCA9IG4oKSwgCiAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgQXZnX3Zpb2xhdGlvbiA9IFRvdGFsX1Zpb2xhdGlvbiAvIGNhc2VfY291bnQpICU+JQogIGZpbHRlcihjYXNlX2NvdW50ID49IDUwKSAlPiUgCiAgYXJyYW5nZSAoZGVzYyAoQXZnX3Zpb2xhdGlvbikpCgpgYGAKClE2LiBXaGljaCBlbXBsb3llci9idXNpbmVzcyBoYWQgdG8gcGF5IHRoZSBoaWdoZXN0IGFtb3VudCBpbiBiYWNrIHdhZ2VzIHRvIGl0cyBlbXBsb3llZXMgZm9yIHZpb2xhdGluZyBIb3VyIGFuZCBXYWdlIENvbXBsaWFuY2UgYWNyb3NzIHRoZSBVLlMuPwojQW5zd2VyOiBQdWVydG8gUmljbyBEZXBhcnRtZW50IG9mIENvcnJlY3Rpb25zIOKAlCAkMzksOTUwLDkzMy4xMC4KCiNQcm9jZXNzOiJCYWNrIFdhZ2VzIEFncmVlZCB0byBQYXkiIGlzIGFuIGltcG9ydGFudCBpbmRpY2F0b3IsIGFzIGl0IHJlZmxlY3RzIHRoZSBmaW5hbmNpYWwgcmVzdGl0dXRpb24gcHJvdmlkZWQgdG8gd29ya2VycyB3aG8gd2VyZSB2aWN0aW1zIG9mIHdhZ2UgdGhlZnQgb3Igb3RoZXIgbGFib3IgdmlvbGF0aW9ucy4gVGhlcmVmb3JlLCBJIHdhbnRlZCB0byBmaW5kIG91dCB3aGljaCBlbXBsb3llcnMgaGFkIHRvIHBheSB0aGUgaGlnaGVzdCBhbW91bnQgaW4gYmFjayB3YWdlcy5UbyBhbmFseXplIHRoaXMsIEkgZm9sbG93ZWQgYSBzaW1pbGFyIGFwcHJvYWNoIGFzIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbi4gSG93ZXZlciwgdGhpcyB0aW1lIEkgc3VtbWFyaXplZCB0aGUgYndfYXRwX2FtdCAoYmFjayB3YWdlcyBhZ3JlZWQgdG8gcGF5KSBhbmQgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlci4gVGhlIG91dGNvbWUgcmV2ZWFsZWQgc29tZSBuZXcgZW1wbG95ZXIgbmFtZXMgdGhhdCB3ZXJlIG5vdCBhdCB0aGUgdG9wIGluIHRoZSBwcmV2aW91cyBhbmFseXNpcywgaW5kaWNhdGluZyB0aGF0IGRpZmZlcmVudCBlbXBsb3llcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgdHlwZXMgYW5kIGxldmVscyBvZiB2aW9sYXRpb25zLiBGdXJ0aGVybW9yZSwgSSB3YW50ZWQgdG8gc2VlIGhvdyBtYW55IGVtcGxveWVlcyB3ZXJlIHNldCB0byByZWNlaXZlIHRob3NlIGJhY2sgd2FnZXMuIFNvLCBJIGFkZGVkIGFub3RoZXIgc3VtKCkgZnVuY3Rpb24gZm9yIHRoZSBlZV9hdHBfY250IGluZGljYXRvciwgd2hpY2ggcmVmZXJzIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgZW1wbG95ZWVzIHJlY2VpdmluZyBiYWNrIHdhZ2VzLiBUaGlzIHJlc3VsdCBhcHBlYXJlZCBpbiBhIHNlcGFyYXRlIGNvbHVtbiBhbG9uZ3NpZGUgdGhlIHRvdGFsIGJhY2sgd2FnZXMuIApgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcmlzZSAodG90YWxfQmFja3dhZ2VzID0gc3VtIChid19hdHBfYW10KSwgVG90YWxfRW1wbG95ZWVfdG9fUGF5ID0gc3VtIChlZV9hdHBfY210KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAodG90YWxfQmFja3dhZ2VzKSkKCmBgYAoKUTcuIFdoaWNoIGVtcGxveWVyL2J1c2luZXNzIGhhZCB0byBwYXkgdGhlIGhpZ2hlc3QgdG90YWwgYW1vdW50IG9mIGNpdmlsIG1vbmV5IHBlbmFsdGllcyAoQ01QKSBmb3IgdmlvbGF0aW5nIEhvdXIgYW5kIFdhZ2UgQ29tcGxpYW5jZSBhY3Jvc3MgdGhlIFUuUy4/CiNBbnN3ZXI6IFRoZSByZXN1bHRzIGNvbnRhaW4gc29tZSBlcnJvcnMuIEkgYW0gZ2V0dGluZyB0aGUgc2FtZSB0cmFkZSBuYW1lIGFwcGVhcmluZyB0d2ljZSBhZnRlciBncm91cGluZyB0aGUgZGF0YS4gSSBjb3VsZG7igJl0IGZpZ3VyZSBvdXQgZXhhY3RseSB3aHkgdGhpcyBpcyBoYXBwZW5pbmcsIGJ1dCBJIGZvdW5kIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHRyYWRlIG5hbWUgZmllbGQuCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBncm91cF9ieSh0cmFkZV9ubSkgJT4lCiAgc3VtbWFyaXNlICh0b3RhbF9jbXBfYXNzZCA9IHN1bSAoY21wX2Fzc2QpKSAlPiUKICBhcnJhbmdlIChkZXNjICh0b3RhbF9jbXBfYXNzZCkpCgpVU193YWdlX3RoZWZ0ICU+JSBmaWx0ZXIodHJhZGVfbm0gPT0gIlBlcmkgJiBTb25zIEZhcm0sIEluYy4iKQpVU193YWdlX3RoZWZ0ICU+JSBmaWx0ZXIoZ3JlcGwoIlBlcmkiLHRyYWRlX25tKSkgJT4lIGFycmFuZ2UoY2FzZV9pZCkKCm5hbWUgPC0gVVNfd2FnZV90aGVmdCAlPiUgZmlsdGVyKGNhc2VfaWQ9PSIxNTU5MDIxIikgJT4lIHB1bGwodHJhZGVfbm0pClVTX3dhZ2VfdGhlZnQgJT4lIGZpbHRlcih0cmFkZV9ubSA9PSBuYW1lIHwgZ3JlcGwoIlBlcmkgJiBTb25zIiwgdHJhZGVfbm0pKQoKVVNfd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShsZWdhbF9uYW1lKSAlPiUKICBzdW1tYXJpc2UgKHRvdGFsX2NtcF9hc3NkID0gc3VtIChjbXBfYXNzZCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKHRvdGFsX2NtcF9hc3NkKSkKClVTX3dhZ2VfdGhlZnQgJT4lIGZpbHRlcihncmVwbCgiUGVyaSAmIFNvbnMiLGxlZ2FsX25hbWUpKSAlPiUgYXJyYW5nZShjYXNlX2lkKQoKYGBgCgpROC4gV2hpY2ggZW1wbG95ZXIvYnVzaW5lc3MgdmlvbGF0ZWQgSG91ciBhbmQgV2FnZSBDb21wbGlhbmNlIGFnYWluc3QgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGVtcGxveWVlcyBpbiB0aGUgVS5TLj8KI0Fuc3dlcjogV2FsbWFydC4gQSB0b3RhbCBvZiA4OCwyNzggZW1wbG95ZWVzIHdlcmUgYWZmZWN0ZWQgYnkgV2FsbWFydCdzIHZpb2xhdGlvbnMgb2YgSG91ciBhbmQgV2FnZSBDb21wbGlhbmNlLCB3aGljaCBpcyB0aGUgaGlnaGVzdCBudW1iZXIgaW4gVS5TLgoKI1Byb2Nlc3M6IEFub3RoZXIgaW1wb3J0YW50IHZhcmlhYmxlIGluIHRoaXMgZGF0YXNldCBpcyBlZV92aW9sdGRfY250LCB3aGljaCByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBlbXBsb3llZXMgYWZmZWN0ZWQgYnkgdmlvbGF0aW9ucy4gVXNpbmcgdGhpcyB2YXJpYWJsZSwgSSB3YW50ZWQgdG8gaWRlbnRpZnkgd2hpY2ggZW1wbG95ZXJzIGFmZmVjdGVkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBlbXBsb3llZXMgYWNyb3NzIHRoZSBVLlMuIFRvIGFuYWx5emUgdGhpcywgSSBncm91cGVkIHRoZSBkYXRhIGJ5IHRyYWRlX25tIChlbXBsb3llciBuYW1lKSBhbmQgc3VtbWFyaXplZCB0aGUgImVlX3Zpb2x0ZF9jbnQiIHZhcmlhYmxlLiBUaGVuLCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gaGlnaGxpZ2h0IHRoZSBlbXBsb3llcnMgd2l0aCB0aGUgZ3JlYXRlc3QgbnVtYmVyIG9mIGFmZmVjdGVkIGVtcGxveWVlcy4gIApgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcmlzZSAodG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzID0gc3VtIChlZV92aW9sdGRfY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAodG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzKSkKCmBgYAoKUTkuIFdoYXQgaXMgdGhlIHllYXItd2lzZSB0cmVuZCBmb3IgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gY2FzZXMgaW4gdGhlIFUuUy4/CiNBbnN3ZXI6IFRoZSB5ZWFyIDIwMTAgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNhc2VzLCB3aXRoIDI0LDk1NC4gSG93ZXZlciwgdGhlIGFuYWx5c2lzIHNob3dzIHRoYXQgdGhlIHBlcmlvZCBmcm9tIDIwMDkgdG8gMjAxMyBzYXcgdGhlIGhpZ2hlc3QgeWVhcmx5IGNhc2UgY291bnRzIGZvciBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbnMuIFRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyB2YXJpZWQgYWNyb3NzIHRoZXNlIHllYXJzLiBGb3IgZXhhbXBsZSwgaW4gMjAxMiwgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyB3YXMgY29tcGFyYXRpdmVseSBsb3dlciBhbW9uZyB0aGUgdG9wIGZpdmUgeWVhcnMsIGJ1dCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgd2FzIHRoZSBoaWdoZXN0LiAKCiNQcm9jZXNzOiBJIHdhbnRlZCB0byBhbmFseXplIHRoZSB5ZWFyLXdpc2UgdHJlbmQgb2YgdG90YWwgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gY2FzZXMgYW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucy4gVG8gZG8gdGhpcywgSSBncm91cGVkIHRoZSBkYXRhIGJ5IHllYXIgYW5kIHRoZW4gc3VtbWFyaXplZCBib3RoIHRoZSBudW1iZXIgb2YgY2FzZXMgYW5kIHRoZSB0b3RhbCB2aW9sYXRpb25zLkZvciB0aGUgbnVtYmVyIG9mIGNhc2VzLCBJIHVzZWQgdGhlIGNvdW50KCkgZnVuY3Rpb24gd2l0aCBuKCkgdG8gY291bnQgZWFjaCBjYXNlIGFzIGEgc2luZ2xlLCB1bmlxdWUgaW5zdGFuY2UuIEZvciB2aW9sYXRpb25zLCBJIHVzZWQgc3VtKCkgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBhY3Jvc3MgYWxsIGNhc2VzIGZvciBlYWNoIHllYXIuIEZpbmFsbHksIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgb2YgdG90YWwgY2FzZXMgaW4gZGVzY2VuZGluZyBvcmRlciB0byBvYnNlcnZlIHdoaWNoIHllYXJzIGhhZCB0aGUgaGlnaGVzdCBudW1iZXJzIG9mIGNhc2VzLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlICggY291bnQgPSBuKCksIFRvdGFsX1Zpb2xhdGlvbiA9IHN1bSAoY2FzZV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAoY291bnQpKQoKYGBgCgpRMTAuIFdoYXQgaXMgdGhlIHRyZW5kIGluIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGNhc2VzIGluIHRoZSBVLlMuIG92ZXIgdGhlIGxhc3QgMTAgeWVhcnM/CiNBbnN3ZXI6IFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGNhc2VzIGFjcm9zcyB0aGUgVS5TLiBoYXZlIGJlZW4gc3RlYWRpbHkgZGVjcmVhc2luZyBvdmVyIHRoZSBwYXN0IDEwIHllYXJzLiBJbiAyMDE1LCB0aGUgdG90YWwgbnVtYmVyIG9mIGNhc2VzIHdhcyAxOCw1MDAsIHdoaWNoIGRyb3BwZWQgc2lnbmlmaWNhbnRseSB0byBqdXN0IDcxNyBpbiAyMDI0LiBIb3dldmVyLCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgd2l0aGluIHRoZXNlIGNhc2VzIHZhcmllZCBieSB5ZWFyLiBEZXNwaXRlIHRoZXNlIGZsdWN0dWF0aW9ucywgdGhlIG51bWJlciBvZiB2aW9sYXRpb25zIGhhcyBhbHNvIHNob3duIGEgZG93bndhcmQgdHJlbmQgc2luY2UgMjAxOS4KCiNwcm9jZXNzOiBGb3IgdGhpcyBxdWVzdGlvbiwgSSBmb2xsb3dlZCBhIHNpbWlsYXIgYXBwcm9hY2ggYXMgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9ucywgYnV0IGFkZGVkIGEgZmlsdGVyIGZvciBzcGVjaWZpYyB5ZWFycy4gVG8gYXBwbHkgdGhlIGZpbHRlciwgSSB1c2VkIHRoZSAlaW4lIGMoKSBzeW50YXggZm9yIGFjY3VyYXRlIHJlc3VsdHMuIApgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKFllYXIgJWluJSBjKDIwMTUsIDIwMTYsIDIwMTcsIDIwMTgsIDIwMTksIDIwMjAsIDIwMjEsIDIwMjIsIDIwMjMsIDIwMjQpKSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpemUoY291bnQgPSBuKCksCiAgICB0b3RhbF92aW9sYXRpb24gPSBzdW0oY2FzZV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZShkZXNjKGNvdW50KSkKCmBgYAoKUTExLiBXaGljaCBpbmR1c3RyeSBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgY2FzZXMgYW5kIHZpb2xhdGlvbnMgaW4gdGhlIFUuUy4/IEhvdyBtYW55IGVtcGxveWVlcyB3ZXJlIGFmZmVjdGVkIGluIHRob3NlIGluZHVzdHJpZXM/CgojQW5zd2VyOiBJIGhhdmUgdHdvIGFuc3dlcnMgdG8gdGhpcyBxdWVzdGlvbi4gSWYgSSBsb29rIGF0IHRoZSByYXcgZGF0YSB3aXRob3V0IGNvbnNpZGVyaW5nIGJ1c2luZXNzIHNpemUgb3IgY29udGV4dCwgdGhlIFJlc3RhdXJhbnQgYW5kIEhvdGVsIGluZHVzdHJ5IGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBjYXNlcy4gVGhpcyBpbmR1c3RyeSBhbHNvIGxlYWRzIGluIHRvdGFsIHZpb2xhdGlvbnMgYW5kIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgZW1wbG95ZWVzLiBIb3dldmVyLCBub3QgYWxsIGluZHVzdHJpZXMgYXJlIGVxdWFsIGluIHNpemUsIHNvIGNvbXBhcmluZyB0b3RhbCBudW1iZXJzIGFsb25lIG1heSBub3QgZ2l2ZSB0aGUgZnVsbCBwaWN0dXJlLiBXaGVuIEkgY2FsY3VsYXRlIHRoZSBhdmVyYWdlIG51bWJlciBvZiB2aW9sYXRpb25zIHBlciBjYXNlLCB0aGUgcmVzdWx0cyBjaGFuZ2UuIEluIHRoYXQgY2FzZSwgSGVhbHRoIGFuZCBQZXJzb25hbCBDYXJlIFN0b3JlcyBoYXZlIHRoZSBoaWdoZXN0IGF2ZXJhZ2UsIHdpdGggYWJvdXQgMyw3MTAgdmlvbGF0aW9ucyBwZXIgY2FzZS4KCiNQcm9jZXNzIChBbnN3ZXIgMSDigJMgVG90YWwgTnVtYmVycyk6IFRvIGlkZW50aWZ5IGluZHVzdHJ5LXdpc2UgcGF0dGVybnMsIEkgZ3JvdXBlZCB0aGUgZGF0YXNldCBieSBuYWljc19jb2RlX2Rlc2NyaXB0aW9uLCB3aGljaCBzaG93cyB0aGUgaW5kdXN0cnkgbmFtZS4gQWZ0ZXIgZ3JvdXBpbmcsIEkgc3VtbWFyaXplZCB0aHJlZSBrZXkgdGhpbmdzOiBUb3RhbCBudW1iZXIgb2YgY2FzZXMgKHVzaW5nIG4oKSksIFRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zICh1c2luZyBzdW0oY2FzZV92aW9sdG5fY250KSksIFRvdGFsIGFmZmVjdGVkIGVtcGxveWVlcyAodXNpbmcgc3VtKGVlX3ZvaWx0ZF9jbnQpKS4gVGhlbiwgSSBhcnJhbmdlZCB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY2FzZXMgdG8gZmluZCB3aGljaCBpbmR1c3RyaWVzIGhhZCB0aGUgbW9zdCByZXBvcnRlZCB3YWdlIGFuZCBob3VyIHZpb2xhdGlvbnMuCgojUHJvY2VzcyAoQW5zd2VyIDIg4oCTIEF2ZXJhZ2UgVmlvbGF0aW9ucyBwZXIgQ2FzZSk6IEZvciBhIGZhaXJlciBjb21wYXJpc29uLCBJIGFnYWluIGdyb3VwZWQgdGhlIGRhdGEgYnkgbmFpY3NfY29kZV9kZXNjcmlwdGlvbi4gSSB1c2VkIHN1bW1hcml6ZSgpIHRvOiBDb3VudCB0b3RhbCBjYXNlcyB1c2luZyBuKCksIFN1bSB0b3RhbCB2aW9sYXRpb25zIGFuZCBhZmZlY3RlZCBlbXBsb3llZXMsIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSB2aW9sYXRpb25zIHBlciBjYXNlIGJ5IGRpdmlkaW5nIHRvdGFsIHZpb2xhdGlvbnMgYnkgdGhlIGNhc2UgY291bnQuIFRvIGF2b2lkIG1pc2xlYWRpbmcgcmVzdWx0cyBmcm9tIGluZHVzdHJpZXMgd2l0aCB2ZXJ5IGZldyBjYXNlcywgSSBmaWx0ZXJlZCBmb3IgaW5kdXN0cmllcyB3aXRoIGF0IGxlYXN0IDUwIGNhc2VzLiBGaW5hbGx5LCBJIHNvcnRlZCB0aGUgZGF0YSBieSBhdmVyYWdlIHZpb2xhdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlci4gCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBncm91cF9ieSggaW5kdXN0cnkgPSBuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpc2UgKCBjYXNlX2NvdW50ID0gbigpLCB0b3RhbF92aW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKGNhc2VfY291bnQpKQoKVVNfd2FnZV90aGVmdCAlPiUKICBncm91cF9ieSAoIGluZHVzdHJ5ID0gbmFpY3NfY29kZV9kZXNjcmlwdGlvbikgJT4lCiAgc3VtbWFyaXNlIChjYXNlX2NvdW50ID0gbigpLCB0b3RhbF92aW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCksCiAgICAgICAgICAgICAgYXZnX3Zpb2xhdGlvbiA9IHRvdGFsX3Zpb2xhdGlvbiAvIGNhc2VfY291bnQpICU+JQogIGZpbHRlcihjYXNlX2NvdW50ID49IDUwKSAlPiUgCiAgYXJyYW5nZSAoZGVzYyAoYXZnX3Zpb2xhdGlvbikpCgpgYGAKClExMjogV2hpY2ggaW5kaWNhdG9ycyBvZiBXYWdlICYgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBkYXRhIGhhdmUgdGhlIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucz8gCiNBbnN3ZXI6IEZhbWlseSBhbmQgTWVkaWNhbCBMZWF2ZSBBY3QgKEZNTEEpIHZpb2xhdGlvbjogNiw2MTgsMjI2LiBGb2xsb3dpbmcgU2VydmljZSBDb250cmFjdCBWaW9sYXRpb246IDQ4MCw3MDQuIAoKI1Byb2Nlc3M6IFdhZ2UgJiBIb3VyIENvbXBsaW5jZSAgQWN0aW9uIGRhdGEgaGFzIG1vcmUgdGhhbiA4MCB2YXJpYWJsZSwgaGFsZiBvZiB0aG9zZSBhcmUgcmVsYXRlIHRvIHZvaWxhdGlvbiBjb3VudC4gQW1vbmcgdGhlbSA2IHZlcmlhYmxlIGFyZSBtb3N0IGltcG90YW50IHRvIGZvbGxvdyBhY2NvZGluZyB0byBEZXBhcnRtZW50IG9mIExhYm9yLiBUaGF0IHdoeSBJIG1lc3N1cmUgdGhvc2UgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24uIEZpcnN0LCBJIHNlbGVjdGVkIHNpeCBzcGVjaWZpYyB2aW9sYXRpb24tcmVsYXRlZCBjb2x1bW5zIGZyb20gdGhlIGRhdGFzZXQ6IGZsc2FfdmlvbHRuX2NudCAoRmFpciBMYWJvciBTdGFuZGFyZHMgQWN0IHZpb2xhdGlvbnMpLCBtc3BhX3Zpb2x0bl9jbnQgKE1pZ3JhbnQgYW5kIFNlYXNvbmFsIEFncmljdWx0dXJhbCBXb3JrZXIgUHJvdGVjdGlvbiBBY3QgdmlvbGF0aW9ucyksIHNjYV92aW9sdG5fY250IChTZXJ2aWNlIENvbnRyYWN0IEFjdCB2aW9sYXRpb25zKSwgZm1sYV92aW9sdG5fY250IChGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgQWN0IHZpb2xhdGlvbnMpLCBoMWJfdmlvbHRuX2NudCAoSC0xQiB3b3JrIHZpc2EgdmlvbGF0aW9ucyksIGZsc2FfY2xfdmlvbHRuX2NudCAoQ2hpbGQgTGFib3IgdmlvbGF0aW9ucyB1bmRlciBGTFNBKS4gVGhlbiwgSSB1c2VkIHRoZSBzdW1tYXJpemUoKSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIHVuZGVyIGVhY2ggbGF3LiBJIHJlbmFtZWQgdGhlIG91dHB1dCBjb2x1bW5zIGZvciBjbGFyaXR5LCBzbyBlYWNoIHRvdGFsIHJlZmxlY3RzIHRoZSByZXNwZWN0aXZlIHZpb2xhdGlvbiB0eXBlLiBIb3dldmVyLCB0aGUgd2F5IHRoZSByZXN1bHRzIHdlcmUgZGlzcGxheWVkIHVzaW5nIHRoZSBwcmV2aW91cyBmdW5jdGlvbiBtYWRlIGl0IGRpZmZpY3VsdCB0byBtZWFzdXJlIG9yIGFuYWx5emUgdGhlIGRhdGEgY2xlYXJseS4gVGhlcmVmb3JlLCBJIHdhbnRlZCB0byByZXN0cnVjdHVyZSB0aGUgb3V0cHV0IGJ5IGhhdmluZyBhbGwgdmlvbGF0aW9uIHR5cGVzIGxpc3RlZCBpbiBvbmUgY29sdW1uIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHZpb2xhdGlvbiBudW1iZXJzIGluIGFub3RoZXIgY29sdW1uLiBUbyBhY2hpZXZlIHRoaXMsIEkgdXNlZCB0aGUgcGl2b3RfbG9uZ2VyKCkgZnVuY3Rpb24uIEluIG15IG1pZC10ZXJtIHByb2plY3QsIEkgaGFkIHVzZWQgcGl2b3Rfd2lkZXIoKSwgc28gSSB3YXMgYWxyZWFkeSBmYW1pbGlhciB3aXRoIGhvdyB0aGUgcGl2b3RfbG9uZ2VyKCkgZnVuY3Rpb24gd29ya3MuIEkgYXBwbGllZCBpdCBoZXJlIHRvIGRpc3BsYXkgdGhlIHJlc3VsdHMgaW4gYSBtb3JlIHJlYWRhYmxlIGZvcm1hdCBhbmQgdGhlbiBhcnJhbmdlZCB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIGVhc2llciBjb21wYXJpc29uIGFuZCBhbmFseXNpcy4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogICAgc2VsZWN0KGZsc2FfdmlvbHRuX2NudCwgbXNwYV92aW9sdG5fY250LCAgc2NhX3Zpb2x0bl9jbnQsIAogICAgICAgICBmbWxhX3Zpb2x0bl9jbnQsIGgxYl92aW9sdG5fY250LCBmbHNhX2NsX3Zpb2x0bl9jbnQpICU+JQogIHN1bW1hcml6ZSAoRmFpcl9MYWJvcl9TdGFuZGFyZHNfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIE1pZ3JhbnRfQWdyaWN1bHR1cmFsX1Byb3RlY3Rpb25fVmlvbGF0aW9uID0gc3VtIChtc3BhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCksCiAgICAgICAgICAgICBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24gPSBzdW0gKGZtbGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgSW1taWdyYXRpb25fV29ya19WaXNhX1Zpb2xhdGlvbiA9IHN1bSAoaDFiX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkKCiNGaW5hbCBjb2RlOiAKVVNfd2FnZV90aGVmdCAlPiUKICAgIHNlbGVjdChmbHNhX3Zpb2x0bl9jbnQsIG1zcGFfdmlvbHRuX2NudCwgIHNjYV92aW9sdG5fY250LCAKICAgICAgICAgZm1sYV92aW9sdG5fY250LCBoMWJfdmlvbHRuX2NudCwgZmxzYV9jbF92aW9sdG5fY250KSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBNaWdyYW50X0FncmljdWx0dXJhbF9Qcm90ZWN0aW9uX1Zpb2xhdGlvbiA9IHN1bSAobXNwYV92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBTZXJ2aWNlX0NvbnRyYWN0X1Zpb2xhdGlvbiA9IHN1bSAoc2NhX3Zpb2x0bl9jbnQpLAogICAgICAgICAgICAgRmFtaWx5X01lZGljYWxfTGVhdmVfVmlvbGF0aW9uID0gc3VtIChmbWxhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIEltbWlncmF0aW9uX1dvcmtfVmlzYV9WaW9sYXRpb24gPSBzdW0gKGgxYl92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBDaGlsZF9sYWJvcl9WaW9sYXRpb24gPSBzdW0gKGZsc2FfY2xfdmlvbHRuX2NudCkpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJWaW9sYXRpb25fVHlwZSIsIHZhbHVlc190byA9ICJUb3RhbF9Db3VudCIpICU+JQogIGFycmFuZ2UoZGVzYyhUb3RhbF9Db3VudCkpCgpgYGAKClExMzogSG93IGhhcyB0aGUgbnVtYmVyIG9mIG1ham9yIGluZGljYXRvcnMgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb25zIHZhcmllZCBvdmVyIHRoZSB5ZWFycz8KI0Fuc3dlcjogVGhlIHJlc3VsdHMgc2hvdyB0aGF0IGV2ZXJ5IG1ham9yIGluZGljYXRvciBoYXMgZGVjcmVhc2VkIHNpZ25pZmljYW50bHkgb3ZlciB0aGUgcGFzdCB0ZW4geWVhcnMuIEZvciBpbnN0YW5jZSwgRmFpciBMYWJvciBTdGFuZGFyZHMgVmlvbGF0aW9ucyBkcm9wcGVkIGZyb20gMyw1NTAgaW4gMjAxNSB0byBqdXN0IDQyIGluIDIwMjQuIFNlcnZpY2UgQ29udHJhY3QgVmlvbGF0aW9uIHdhcyAyMiwyODkgaW4gMjAxNSBhbmQgZGVjbGluZWQgdG8gMjAwIGluIDIwMjQuIEZhbWlseSBhbmQgTWVkaWNhbCBMZWF2ZSBWaW9sYXRpb25zIGRlY3JlYXNlZCBmcm9tIDIyMCw3NzQgdG8gMiw4NzIuIENoaWxkIExhYm9yIFZpb2xhdGlvbiBhbHNvIHNhdyBhIHJlZHVjdGlvbiwgZnJvbSAzLDU1MCBpbiAyMDE1IHRvIDQyIGluIDIwMjQuIFRoaXMgdHJlbmQgaW5kaWNhdGVzIHN1YnN0YW50aWFsIGltcHJvdmVtZW50IGluIHdhZ2UgYW5kIGhvdXIgY29tcGxpYW5jZSBvdmVyIHRoZSBsYXN0IGRlY2FkZS4gICAKCiNQcm9jZXNzOiBUbyBhbmFseXplIHllYXItd2lzZSBkYXRhIGZvciBlYWNoIGluZGljYXRvciwgSSBmaXJzdCBncm91cGVkIHRoZSBkYXRhc2V0IGJ5IHllYXIuIFNpbmNlIHRoZSBkYXRhc2V0IHNwYW5zIGEgbG9uZyBwZXJpb2QsIEkgZmlsdGVyZWQgaXQgdG8gb25seSBpbmNsdWRlIHRoZSBtb3N0IHJlY2VudCAxMCB5ZWFycyB1c2luZyB0aGUgJWluJSBvcGVyYXRvci4gVGhlbiwgSSB1c2VkIHRoZSBzYW1lIGNvZGUgc3RydWN0dXJlIGZyb20gdGhlIHByZXZpb3VzIHF1ZXN0aW9uIHRvIHN1bW1hcml6ZSB2aW9sYXRpb25zIGZvciBzaXggbWFqb3IgaW5kaWNhdG9ycy4gSSBhbHNvIGludGVuZGVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVnYXRpdmUgZ3Jvd3RoIHBlcmNlbnRhZ2Ugb3ZlciB0aGUgdGVuLXllYXIgc3BhbiB0byBzaG93IHRoZSByYXRlIG9mIGltcHJvdmVtZW50IGJ1dCB3YXMgdW5hYmxlIHRvIHdyaXRlIGEgY29kZSBpdCBzdWNjZXNzZnVsbHkuIEluc3RlYWQsIEkgc29ydGVkIHRoZSBzdW1tYXJpemVkIGRhdGEgYnkgeWVhciB0byBvYnNlcnZlIHRoZSB0cmVuZC4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0KSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc2VsZWN0KGZsc2FfdmlvbHRuX2NudCwgbXNwYV92aW9sdG5fY250LCAgc2NhX3Zpb2x0bl9jbnQsIAogICAgICAgICBmbWxhX3Zpb2x0bl9jbnQsIGgxYl92aW9sdG5fY250LCBmbHNhX2NsX3Zpb2x0bl9jbnQpICU+JQogIHN1bW1hcml6ZSAoRmFpcl9MYWJvcl9TdGFuZGFyZHNfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIE1pZ3JhbnRfQWdyaWN1bHR1cmFsX1Byb3RlY3Rpb25fVmlvbGF0aW9uID0gc3VtIChtc3BhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCksCiAgICAgICAgICAgICBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24gPSBzdW0gKGZtbGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgSW1taWdyYXRpb25fV29ya19WaW9sYXRpb24gPSBzdW0gKGgxYl92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBDaGlsZF9sYWJvcl9WaW9sYXRpb24gPSBzdW0gKGZsc2FfY2xfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKFllYXIpCgpgYGAKCgpRMTQuIEhvdyBkbyB0aGUgdG9wIGZpdmUgc3RhdGVzIHRoYXQgaGF2ZSBkb25lIHRoZSBoaWdoZXN0IHZpb2xhdGlvbnMgaW4gcGVyIDEwLDAwMCBwZW9wbGUgdmFyeSBpbiB0ZXJtcyBvZiB0b3RhbCB2aW9sYXRpb25zIG9mIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBvdmVyIHRoZSBsYXN0IDEwIHllYXJzPwojQW5zd2VyOiBBbGwgZml2ZSBzdGF0ZXMgaGF2ZSBzZWVuIGRlY3JlYXNlcyBpbiB2aW9sYXRpb25zIGJ5IDIwMjQuIEV2ZXJ5IHN0YXRlJ3MgdG90YWwgdmlvbGF0aW9uIHdhcyBiZWxvdyBhIDUwMCBsYXN0IHllYXIuIEFya2Fuc2FzIGhhZCB0aGUgaGlnaGVzdCB2aW9sYXRpb25zIGluIDIwMTYgd2l0aCA0NTYsMjM3IGFuZCByZW1haW5lZCBvbmUgb2YgdGhlIHRvcCB2aW9sYXRvcnMuIFRlbm5lc3NlZSBzYXcgdHdvIHNwaWtlcyBpbiB2aW9sYXRpb25zOiAyNjYsNDEwIGluIDIwMTkgYW5kIDI0MCw5ODIgaW4gMjAyMS4gQWxhYmFtYSBoYWQgaGlnaCB2aW9sYXRpb25zIGluIHRoZSBlYXJseSB5ZWFycywgZXNwZWNpYWxseSBpbiAyMDE2ICgxNDQsODgxKSwgdGhlbiBkZWNsaW5lZC4gUmhvZGUgSXNsYW5kIHNob3dlZCBjb25zaXN0ZW50IG1pZC10by1oaWdoIHZpb2xhdGlvbnMgd2l0aCBhIHBlYWsgaW4gMjAyMCAoMSwzNzgpLiBNaW5uZXNvdGEgaGFkIGEgaGlnaCB2aW9sYXRpb24gaW4gMjAxNyAoMzYsMDkyKSBidXQgc2F3IGEgZGVjbGluZSBhZnRlcndhcmQuCgojUHJvY2VzczogVG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIEkgZmlsdGVyZWQgdGhlIGRhdGEgYnkgYm90aCBTdGF0ZSBhbmQgWWVhciwgYXMgSSBuZWVkZWQgaW5mb3JtYXRpb24gZm9yIGZpdmUgc3BlY2lmaWMgc3RhdGVzIG92ZXIgdGhlIGxhc3QgdGVuIHllYXJzLiBGcm9tIHRoZSBiZWdpbm5pbmcgb2YgbXkgY29kZSwgSSB1c2VkIHRoZSAlaW4lIG9wZXJhdG9yIHRvIHNlbGVjdCBvbmx5IHRoZSByZWxldmFudCBzdGF0ZXMgYW5kIHllYXJzLk5leHQsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBib3RoIFllYXIgYW5kIFN0YXRlLCBzaW5jZSBJIG5lZWRlZCB0aGUgdmlvbGF0aW9uIG51bWJlcnMgZm9yIGVhY2ggc3RhdGUgYWNyb3NzIGVhY2ggeWVhci4gQWZ0ZXIgZ3JvdXBpbmcsIEkgc3VtbWFyaXplZCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgZm9yIGVhY2ggY29tYmluYXRpb24gb2YgeWVhciBhbmQgc3RhdGUuIEZpbmFsbHksIHRvIHByZXNlbnQgdGhlIGRhdGEgY2xlYXJseSBpbiBhIHRhYnVsYXIgZm9ybWF0LCBJIHVzZWQgdGhlIHBpdm90X3dpZGVyKCkgZnVuY3Rpb24gdG8gcmVzaGFwZSB0aGUgZGF0YeKAlG1ha2luZyBlYWNoIHN0YXRlIGEgc2VwYXJhdGUgY29sdW1uIHdpdGggeWVhcnMgYXMgcm93cy4gCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoc3RfY2QgJWluJSBjKCJBUiIsICJSSSIsICJUTiIsICJNTiIsICJBTCIpKSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGdyb3VwX2J5KFllYXIsIHN0X2NkKSAlPiUKICBzdW1tYXJpemUodG90YWxfdmlvbGF0aW9uID0gc3VtKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAic3RfY2QiLCAKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9ICJ0b3RhbF92aW9sYXRpb24iKSAKCmBgYAoKUTE1LiBIb3cgaGF2ZSB0aGUgc3RhdGVzIHZhcmllZCBpbiB0ZXJtcyBvZiB0b3RhbCB2aW9sYXRpb25zIG9mIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBvdmVyIHRoZSBsYXN0IDEwIHllYXJzPwojQW5zd2VyOiBUaGUgZGF0YSBkb2VzIG5vdCBwcm92aWRlIGEgc2luZ2xlLCBzcGVjaWZpYyBhbnN3ZXIgYnV0IHJhdGhlciBhIHRhYmxlIHdpdGggMTAgY29sdW1ucyBhbmQgNTcgcm93cyByZXByZXNlbnRpbmcgZGlmZmVyZW50IHN0YXRlcyBhbmQgdGVycml0b3JpZXMuIEhvd2V2ZXIsIHN0YXRlcyB3aXRoIHRoZSBoaWdoZXN0IHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIGFsc28gdGVuZCB0byByYW5rIGhpZ2ggYWNyb3NzIGVhY2ggeWVhci4gSG93ZXZlciwgdGhlIHRyZW5kIG9mIG51bWJlcnMgZm9yIGVhY2ggc3RhdGUgaGFzIGJlZW4gZGVjbGluaW5nLiAKCiNQcm9jZXNzOiBUbyBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgSSBmaWx0ZXJlZCB0aGUgZGF0YSBieSBZZWFyLCBhcyBJIG5lZWRlZCBpbmZvcm1hdGlvbiBmb3IgdGVuIHNwZWNpZmljIHllYXJzLiBJIHVzZWQgdGhlICVpbiUgb3BlcmF0b3IgdG8gc2VsZWN0IG9ubHkgdGhlIHJlbGV2YW50IHllYXJzLiBOZXh0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgYm90aCBZZWFyIGFuZCBTdGF0ZSwgc2luY2UgSSBuZWVkZWQgdGhlIHZpb2xhdGlvbiBudW1iZXJzIGZvciBlYWNoIHN0YXRlIGFjcm9zcyBmaWx0ZXJlZCB5ZWFyLiBBZnRlciBncm91cGluZywgSSBzdW1tYXJpemVkIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiB5ZWFyIGFuZCBzdGF0ZS4gRmluYWxseSwgdG8gcHJlc2VudCB0aGUgZGF0YSBjbGVhcmx5IGluIGEgdGFidWxhciBmb3JtYXQsIEkgdXNlZCB0aGUgcGl2b3Rfd2lkZXIoKSBmdW5jdGlvbiB0byByZXNoYXBlIHRoZSBkYXRh4oCUbWFraW5nIGVhY2ggc3RhdGUgYSBzZXBhcmF0ZSBjb2x1bW4gd2l0aCB5ZWFycyBhcyByb3dzLiAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0KSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgc3RfY2QpICU+JQogIHN1bW1hcml6ZSh0b3RhbF92aW9sYXRpb24gPSBzdW0oY2FzZV92aW9sdG5fY250KSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJzdF9jZCIsIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gInRvdGFsX3Zpb2xhdGlvbiIpIAoKYGBgClExNi4gV2hpY2ggc3RhdGUgdGFrZXMgdGhlIGxvbmdlc3QgdGltZSB0byBjb21wbGV0ZSBhIGZpbmRpbmcgb24gYXZlcmFnZT8KI0Fuc3dlcjogUmhvZGUgSXNsYW5kIHRha2VzIHRoZSBsb25nZXN0IHRpbWUgdG8gY29tcGxldGUgYSBmaW5kaW5nLCB3aXRoIGFuIGF2ZXJhZ2Ugb2YgNjc1IGRheXMsIHdoaWNoIGlzIGFsbW9zdCB0d28geWVhcnMuIFRoZSBtZWRpYW4gdGltZSB0byBjb21wbGV0ZSBhIGNhc2UgdGhlcmUgaXMgZXZlbiBoaWdoZXLigJQ3MjggZGF5cy4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBjYWxsZWQgRGF5c190b19jb21wbGV0ZSwgd2hpY2ggSSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIGZpbmRpbmdzX3N0YXJ0X2RhdGUgZnJvbSBmaW5kaW5nc19lbmRfZGF0ZSB1c2luZyB0aGUgYXMubnVtZXJpYygpIGZ1bmN0aW9uLiBOZXh0LCBJIGFycmFuZ2VkIHRoZSBkYXRhIGJ5IERheXNfdG9fY29tcGxldGUgaW4gZGVzY2VuZGluZyBvcmRlci4gSG93ZXZlciwgSSBmb3VuZCBzb21lIGluY29ycmVjdCB2YWx1ZXMgaW4gdGhlIGRhdGVz4oCUc29tZSByZWNvcmRzIHNob3dlZCBkYXRlcyBsaWtlIHRoZSB5ZWFyIDE5MDAgb3IgMzUxOSwgd2hpY2ggYXJlIGxpa2VseSB0eXBvcy4gQWNjb3JkaW5nIHRvIHRoZSBkYXRhIGRpY3Rpb25hcnksIHRoZSBXYWdlICYgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBEYXRhIGluY2x1ZGVzIHJlY29yZHMgb25seSBmcm9tIDE5ODUgdG8gdGhlIHByZXNlbnQsIHNvIEkgZmlsdGVyZWQgdGhlIGRhdGEgdG8gaW5jbHVkZSBvbmx5IGRhdGVzIGJldHdlZW4gMTk4NSBhbmQgMjAyNS4gQWZ0ZXIgZmlsdGVyaW5nLCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgc3RhdGUgdG8gc2VlIHdoaWNoIHN0YXRlcyB0b29rIHRoZSBsb25nZXN0IHRpbWUgdG8gY29tcGxldGUgYSBjYXNlLiBJIHRoZW4gdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdGggdGhlIGF2ZXJhZ2UgKG1lYW4pIGFuZCBtZWRpYW4gbnVtYmVyIG9mIGRheXMgdG8gY29tcGxldGUgYSBmaW5kaW5nLiBUbyBrZWVwIHRoZSByZXN1bHRzIHJlYWxpc3RpYyBhbmQgYXZvaWQgbWlzc2xlYWRpbmcgcmVzdWx0cyBmcm9tIHN0YXRlcyB3aXRoIHZlcnkgZmV3IGNhc2VzLCBJIGZpbHRlcmVkIGZvciBzdGF0ZXMgd2l0aCBtb3JlIHRoYW4gNTAgY2FzZXMuCmBgYHtyfQoKVVNfd2FnZV90aGVmdCA8LSBVU193YWdlX3RoZWZ0ICU+JQogIG11dGF0ZSAoZmluZGluZ3Nfc3RhcnRfZGF0ZSA9IHltZCAoZmluZGluZ3Nfc3RhcnRfZGF0ZSksIAogICAgICAgICAgZmluZGluZ3NfZW5kX2RhdGUgPSB5bWQgKGZpbmRpbmdzX2VuZF9kYXRlKSwKICAgICAgICAgIERheXNfdG9fY29tcGxldGUgPSBhcy5udW1lcmljIChmaW5kaW5nc19lbmRfZGF0ZSAtIGZpbmRpbmdzX3N0YXJ0X2RhdGUpKSAlPiUKICBhcnJhbmdlIChkZXNjKERheXNfdG9fY29tcGxldGUpKQoKI0ZpbmFsIGNvZGU6ClVTX3dhZ2VfdGhlZnQgJT4lCiAgICBtdXRhdGUoZmluZGluZ3Nfc3RhcnRfZGF0ZSA9IHltZChmaW5kaW5nc19zdGFydF9kYXRlKSwgCiAgICBmaW5kaW5nc19lbmRfZGF0ZSA9IHltZChmaW5kaW5nc19lbmRfZGF0ZSksCiAgICBEYXlzX3RvX2NvbXBsZXRlID0gYXMubnVtZXJpYyhmaW5kaW5nc19lbmRfZGF0ZSAtIGZpbmRpbmdzX3N0YXJ0X2RhdGUpKSAlPiUKICBmaWx0ZXIoWWVhciA+PSAxOTg1ICYgWWVhciA8PSAyMDI1KSAlPiUKICBncm91cF9ieShzdF9jZCkgJT4lCiAgc3VtbWFyaXplKGF2Z19kYXlzX3RvX2NvbXBsZXRlID0gbWVhbihEYXlzX3RvX2NvbXBsZXRlLCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuX2RheXMgPSBtZWRpYW4oRGF5c190b19jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIHRvdGFsX2Nhc2UgPSBuKCkpICU+JQogIGZpbHRlcih0b3RhbF9jYXNlID49IDUwKSAlPiUKICBhcnJhbmdlKGRlc2MoYXZnX2RheXNfdG9fY29tcGxldGUpKQoKYGBgCiNNaXNzb3VyaSBzcGVjaWZpYyBkYXRhc2V0OiAKCiNQcm9jZXNzOiBBZnRlciBhbmFseXppbmcgbmF0aW9uYWwgcGVyY3NwZWN0aXZlIGZyb20gdGhlIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gRGF0YSwgSSB3YW50ZWQgdG8gbG9vayBpbnRvIG1pc3NvdXJpIHNwZWNpZmljIGRhdGEgc2V0LiBUaGVyZWZvcmUgSSBmaWx0ZXIgTWlzc291cmkgZGF0YSBvbmx5IGZvciBteSBmdXJ0aGVyIGFuYWx5c2lzLiBGb3IgdGhhdCwgSSB1c2UgZmlsdGVyIGZ1bnRpb24gYW5kIGNyZWF0ZSBhIG5ldyBkYXRhIHNldCBjYWxsZWQgIk1PX3dhZ2VfdGhlZnQiIGZvciBmdXJ0aHVyIGFuYWx5c2lzLiAKYGBge3J9CgpNT193YWdlX3RoZWZ0IDwtIFVTX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKHN0X2NkID09ICJNTyIpCgpgYGAKCgojTWlzc291cmkgY2xlYW4gZGF0YXNldAojRXhjbHVkZSB0aGUgY29sdW1ucyB0aGF0IGNvbnRhaW4gb25seSB6ZXJvcyBpbiBhbGwgcm93cy4KCiNQcm9jZXNzOiBJIGZsbG93ZWQgdGhpcyBwcm9jZXNzIGluIG5hdGlvbmFsIGRhdGEgc2V0IGFzIHdlbGwgdG8gZXhjbHVkZSB0aGUgcm93cyB0aG9zZSBoYXZlIGFueSBkYXRhLiBJIHVzZWQgdGhlIHNlbGVjdCgpIGZ1bmN0aW9uIHRvIGNob29zZSB3aGljaCBjb2x1bW5zIHRvIGtlZXAsIGNvbWJpbmVkIHdpdGggd2hlcmUofiFhbGwoLiA9PSAwKSkgdG8gZmlsdGVyIG91dCBjb2x1bW5zIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIHplcm8uIFRoZSBjb2RlIH4hYWxsKC4gPT0gMCksIG1lYW5zICJrZWVwIGNvbHVtbnMgd2hlcmUgbm90IGFsbCB2YWx1ZXMgYXJlIHplcm8iLiBJdCByZW1vdmVzIG9ubHkgY29sdW1ucyB3aGVyZSBldmVyeSBzaW5nbGUgdmFsdWUgaXMgemVyby4gVGhlIHJlc3VsdCB3YXMgc3RvcmVkIGJhY2sgaW4gdGhlIG9yaWdpbmFsIGRhdGFzZXQgY2FsbGVkIE1PX3dhZ2VfdGhlZnQgd2l0aCA3NSBjb2x1bW5zLCB3aGljaCB3YXMgOTggZm9yIG5hdGlvbmFsIGRhdGEgc2V0LiAgCmBgYHtyfQoKTU9fd2FnZV90aGVmdCA8LSBNT193YWdlX3RoZWZ0ICU+JQogIHNlbGVjdCh3aGVyZSh+IWFsbCguID09IDApKSkKCmBgYAoKCiNTdGFuZGFyZGl6ZSB0aGUgQ2l0eSBOYW1lcyB0byBBbGwgVXBwZXJjYXNlIExldHRlcnMKI1Byb2Nlc3M6IEkgZm91bmQgdGhhdCBzb21lIGNpdHkgbmFtZXMgYXBwZWFyZWQgaW4gZGlmZmVyZW50IGZvcm1hdHPigJRmb3IgaW5zdGFuY2UsIGJvdGggIlNhaW50IExvdWlzIiBhbmQgIlNBSU5UIExPVUlTIiB3ZXJlIHByZXNlbnQuIFRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiBteSBhbmFseXNpcywgSSBzdGFuZGFyZGl6ZWQgYWxsIGNpdHkgbmFtZXMgdG8gdXBwZXJjYXNlLiBUbyBkbyB0aGlzLCBJIHVzZWQgdGhlIG11dGF0ZSgpIGZ1bmN0aW9uIGFsb25nIHdpdGggdGhlIHRvdXBwZXIoKSBmdW5jdGlvbi4gVGhlIHRvdXBwZXIoKSBmdW5jdGlvbiBjb252ZXJ0cyBhbGwgdGV4dCBpbiB0aGUgY3R5X25tIGNvbHVtbiB0byB1cHBlcmNhc2UgbGV0dGVycy4gSSB1cGRhdGVkIHRoZSBvcmlnaW5hbCBkYXRhc2V0IGJ5IGFzc2lnbmluZyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIHNhbWUgbmFtZTogTU9fd2FnZV90aGVmdC4KYGBge3J9CgpNT193YWdlX3RoZWZ0IDwtIE1PX3dhZ2VfdGhlZnQgJT4lCiAgbXV0YXRlKGN0eV9ubSA9IHRvdXBwZXIoY3R5X25tKSkKCmBgYAoKClExNzogV2hpY2ggY29tcGFueS9lbXBsb3llciBpbiBNaXNzb3VyaSBoYWQgdGhlIGhpZ2hlc3QgcmVjb3JkIG9mIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgY2FzZXMgYW5kIG51bWJlciBvZiB2aW9sYXRpb25zPwojQW5zd2VyOiBJIGhhdmUgdHdvIGFuc3dlcnMgdG8gdGhpcyBxdWVzdGlvbi4gSWYgSSBsb29rIGF0IHRoZSByYXcgZGF0YSB3aXRob3V0IGNvbnNpZGVyaW5nIGJ1c2luZXNzIHNpemUgb3IgY29udGV4dCwgSGlnaGVzdCBudW1iZXIgb2YgY2FzZXM6IFN1YndheSwgd2l0aCAzMyBjYXNlcy4gSGlnaGVzdCBudW1iZXIgb2YgdmlvbGF0aW9uczogR2VvcmdlJ3MgUHJvY2Vzc2luZywgSW5jb3Jwb3JhdGVkLCB3aXRoIGEgdG90YWwgb2YgMywxNDggdmlvbGF0aW9ucyBhY3Jvc3MgMiBjYXNlcy4gSG93ZXZlciwgbm90IGFsbCBidXNpbmVzcyBhcmUgZXF1YWwgaW4gc2l6ZSwgc28gY29tcGFyaW5nIHRvdGFsIG51bWJlcnMgYWxvbmUgbWF5IG5vdCBnaXZlIHRoZSBmdWxsIHBpY3R1cmUuIFdoZW4gSSBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UsIHRoZSByZXN1bHRzIGNoYW5nZS4gSW4gdGhhdCBjYXNlLCBJbW8ncyBQaXp6YSBoYXZlIHRoZSBoaWdoZXN0IGF2ZXJhZ2UsIHdpdGggYWJvdXQgMjMgdmlvbGF0aW9ucyBwZXIgY2FzZS4KCiNQcm9jZXNzIDEgKFRvdGFsIE51bWJlcnMpOiBUbyBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyBhbmQgdmlvbGF0aW9uLCBJIHVzZWQgYSBzaW1pbGFyIGFwcHJvYWNoIGluIGJvdGggY2FzZXMsIHdpdGggb25seSBhIHNtYWxsIGRpZmZlcmVuY2UgaW4gdGhlIGFycmFuZ2VtZW50IHN0ZXAuIEkgd2FudGVkIHRvIHByZXNlbnQgdGhlIG51bWJlciBvZiBjYXNlcyBhbmQgdG90YWwgdmlvbGF0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLCBidXQgc2luY2UgdGhlIGVtcGxveWVycyB3aXRoIHRoZSBoaWdoZXN0IGNhc2UgY291bnQgYW5kIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucyB3ZXJlIGRpZmZlcmVudCwgSSB3cm90ZSB0d28gc2VwYXJhdGUgY29kZSBibG9ja3MuIFRoZSBjb2Rld2FzICBzaW1wbGUgYW5kIHNpbWlsYXIgdG8gd2hhdCBJIHVzZWQgZm9yIHRoZSBuYXRpb25hbC1sZXZlbCBkYXRhLiBGaXJzdCwgSSBncm91cGVkIHRoZSBkYXRhIGJ5IHRyYWRlX25tIChlbXBsb3llciBuYW1lKSwgdGhlbiBzdW1tYXJpemVkIGl0LiBGb3IgdGhlIG51bWJlciBvZiBjYXNlcywgSSB1c2VkIHRoZSBuKCkgZnVuY3Rpb24gdG8gY291bnQgaG93IG1hbnkgdGltZXMgZWFjaCBlbXBsb3llciBhcHBlYXJlZCBpbiB0aGUgdHJhZGVfbm0gY29sdW1u4oCUZWFjaCBhcHBlYXJhbmNlIHJlcHJlc2VudHMgYSBjYXNlLkZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIEkgdXNlZCB0aGUgc3VtKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCB2aW9sYXRpb24gY291bnQgcGVyIGVtcGxveWVyLgoKI1Byb2Nlc3MgMiAoQXZlcmFnZSBWaW9sYXRpb25zIHBlciBDYXNlKTogRm9yIGEgZmFpcmVyIGNvbXBhcmlzb24sIEkgYWdhaW4gZ3JvdXBlZCB0aGUgZGF0YSBieSBidXNpbmVzcyAodHJhZGVfbm0pLiBJIHVzZWQgc3VtbWFyaXplKCkgdG86IENvdW50IHRvdGFsIGNhc2VzIHVzaW5nIG4oKSwgU3VtIHRvdGFsIHZpb2xhdGlvbnMgYW5kIGFmZmVjdGVkIGVtcGxveWVlcywgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHZpb2xhdGlvbnMgcGVyIGNhc2UgYnkgZGl2aWRpbmcgdG90YWwgdmlvbGF0aW9ucyBieSB0aGUgY2FzZSBjb3VudC4gVG8gYXZvaWQgbWlzbGVhZGluZyByZXN1bHRzIGZyb20gYnVzaW5lc3Mgd2l0aCB2ZXJ5IGZldyBjYXNlcywgSSBmaWx0ZXJlZCBmb3IgYnVzaW5lc3Mgd2l0aCBhdCBsZWFzdCAxMCBjYXNlcy4gRmluYWxseSwgSSBzb3J0ZWQgdGhlIGRhdGEgYnkgYXZlcmFnZSB2aW9sYXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIuIApgYGB7cn0KCiNQcm9jZXNzIDE6Ck1PX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCAKICAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKGNvdW50KSkKCiNQcm9jZXNzIDI6IApNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKGNhc2VfY291bnQgPSBuKCksIAogICAgICAgICAgICAgVG90YWxfVmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLAogICAgICAgICAgICAgVG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzID0gc3VtIChlZV92aW9sdGRfY250KSwKICAgICAgICAgICAgIEF2Z192aW9sYXRpb24gPSBUb3RhbF9WaW9sYXRpb24gLyBjYXNlX2NvdW50KSAlPiUKICBmaWx0ZXIoY2FzZV9jb3VudCA+PSAxMCkgJT4lIAogIGFycmFuZ2UgKGRlc2MgKEF2Z192aW9sYXRpb24pKQoKYGBgCgpRMTg6IFdoaWNoIGNvbXBhbnkvZW1wbG95ZXIgaW4gTWlzc291cmkgaGFkIHRvIHBheSB0aGUgaGlnaGVzdCBiYWNrIHdhZ2VzLCBhbmQgaG93IG1hbnkgZW1wbG95ZWVzIHJlY2VpdmVkIHRob3NlIGJhY2sgd2FnZXMgZnJvbSBlYWNoIGVtcGxveWVyPwojQW5zd2VyOiBHZW9yZ2UncyBQcm9jZXNzaW5nLCBJbmNvcnBvcmF0ZWQgcGFpZCBhIHRvdGFsIG9mICQxLDI0NSwyNTcuMDkgdG8gMywwODQgZW1wbG95ZWVzLiAKCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBlbXBsb3llciBuYW1lICh0cmFkZV9ubSkuIFRoZW4sIEkgc3VtbWFyaXplZCB0aGUgZGF0YSB1c2luZyBib3RoIGJ3X2F0cF9hbXQgKHdoaWNoIHJlcHJlc2VudHMgYmFjayB3YWdlcyBwYWlkKSBhbmQgZWVfYXRwX2NtdCAod2hpY2ggcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGVtcGxveWVlcyB3aG8gcmVjZWl2ZWQgdGhvc2Ugd2FnZXMpLiBJIGFycmFuZ2VkIHRoZSBzdW1tYXJpemVkIGRhdGEgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0b3RhbCBiYWNrIHdhZ2VzLiBTaW5jZSB0aGUgZW1wbG95ZXIgd2hvIHBhaWQgdGhlIGhpZ2hlc3QgYW1vdW50IGFsc28gaGFwcGVuZWQgdG8gcGF5IHRoZSBoaWdoZXN0IG51bWJlciBvZiBlbXBsb3llZXMsIEkgZGlkbuKAmXQgbmVlZCB0byB3cml0ZSBhIHNlcGFyYXRlIGNvZGUgZm9yIGVtcGxveWVlIGNvdW504oCUYm90aCByZXN1bHRzIGNvdWxkIGJlIHNob3duIGluIG9uZSB0YWJsZS4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKHRvdGFsX0JhY2t3YWdlcyA9IHN1bSAoYndfYXRwX2FtdCksIAogICAgICAgICAgICAgVG90YWxfRW1wbG95ZWVfdG9fUGF5ID0gc3VtIChlZV9hdHBfY210KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAodG90YWxfQmFja3dhZ2VzKSkKCmBgYAoKUTE5OiBXaGljaCBlbXBsb3llci9idXNpbmVzcyBoYWQgdG8gcGF5IHRoZSBoaWdoZXN0IHRvdGFsIGFtb3VudCBvZiBDaXZpbCBNb25leSBQZW5hbHRpZXMgKENNUCkgaW4gTWlzc291cmkgZm9yIHZpb2xhdGluZyBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2U/CiNBbnN3ZXI6IE1pc3NvdXJpIFZlZ2V0YWJsZSBGYXJtIHBhaWQgdGhlIGhpZ2hlc3QgdG90YWwgYW1vdW50IGluIGNpdmlsIG1vbmV5IHBlbmFsdGllcywgd2l0aCAkMzg0LDYyNi42MS4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoaXMsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBlbXBsb3llciBuYW1lICh0cmFkZV9ubSkuIEFmdGVyIHRoYXQsIEkgc3VtbWFyaXplZCB0aGUgY21wX2Fzc2QgY29sdW1uLCB3aGljaCByZXByZXNlbnRzIHRoZSB0b3RhbCBhbW91bnQgb2YgY2l2aWwgbW9uZXkgcGVuYWx0aWVzIGltcG9zZWQgb24gZW1wbG95ZXJzLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYmFzZWQgb24gdGhlIHRvdGFsIENNUCBhbW91bnQgKGNtcF9hc3NkKSB0byBpZGVudGlmeSB0aGUgdG9wIHZpb2xhdG9yLiAgCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieSh0cmFkZV9ubSkgJT4lCiAgc3VtbWFyaXNlICh0b3RhbF9jbXBfYXNzZCA9IHN1bSAoY21wX2Fzc2QpKSAlPiUKICBhcnJhbmdlIChkZXNjICh0b3RhbF9jbXBfYXNzZCkpCgpgYGAKCgpRMjA6IFdoaWNoIGNpdHkgaW4gTWlzc291cmkgZXhwZXJpZW5jZWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNhc2VzLCBoaWdoZXN0IG51bWJlciBvZiB2aW9sYXRpb25zLCBhbmQgdGhlIG1vc3QgYWZmZWN0ZWQgZW1wbG95ZWVzIGFjY29yZGluZyB0byB0aGUgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gZGF0YT8KI0Fuc3dlcjogU2FpbnQgTG91aXMgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgbnVtYmVycyB3aXRoIDEsNDg3IGNhc2VzLCAyNSwwMTkgdG90YWwgdmlvbGF0aW9ucywgYW5kIDIxLDk1NiBhZmZlY3RlZCBlbXBsb3llZXMuCgojUHJvY2VzczogRmlyc3QsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBjaXR5IG5hbWUgKGN0eV9ubSkuIFRvIGFuc3dlciBhbGwgdGhyZWUgcGFydHMgb2YgdGhlIHF1ZXN0aW9uIHRvZ2V0aGVyLCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uOiBGb3IgdGhlIG51bWJlciBvZiBjYXNlcywgSSB1c2VkIHRoZSBuKCkgZnVuY3Rpb24uIFNpbmNlIGVhY2ggcm93IHJlcHJlc2VudHMgYSBjYXNlLCBjb3VudGluZyBob3cgbWFueSB0aW1lcyBhIGNpdHkgYXBwZWFycyBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNhc2VzLiBGb3IgdG90YWwgdmlvbGF0aW9ucyBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzLCBJIHVzZWQgdGhlIHN1bSgpIGZ1bmN0aW9uIG9uIHRoZSByZWxldmFudCBjb2x1bW5zLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIG51bWJlciBvZiBjYXNlcy4gCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShjdHlfbm0pICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCAKICAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgIFRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKGNvdW50KSkKCmBgYAoKUTIxOiBJbiB3aGljaCB5ZWFyIGRpZCBNaXNzb3VyaSBleHBlcmllbmNlIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcywgaGlnaGVzdCBudW1iZXIgb2YgdmlvbGF0aW9ucywgYW5kIHRoZSBtb3N0IGFmZmVjdGVkIGVtcGxveWVlcyBhY2NvcmRpbmcgdG8gdGhlIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGRhdGE/CiNBbnN3ZXI6IFRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcyB3YXMgZmlsZWQgaW4gMjAwOSwgd2l0aCA1MjcgY2FzZXMuIFRoZSBoaWdoZXN0IG51bWJlciBvZiB2aW9sYXRpb25zIG9jY3VycmVkIGluIDIwMDYsIHdpdGggMTIsMzI5IHZpb2xhdGlvbnMuIFRoYXQgc2FtZSB5ZWFyICgyMDA2KSwgMTEsOTA3IGVtcGxveWVlcyB3ZXJlIGFmZmVjdGVk4oCUdGhlIGhpZ2hlc3QgcmVjb3JkZWQuIAoKI1Byb2Nlc3M6VGhlIHByb2Nlc3Mgd2FzIHNpbWlsYXIgdG8gdGhlIG9uZSBJIHVzZWQgaW4gcHJldmlvdXMgcXVlc3Rpb25zLiBJIHN0YXJ0ZWQgYnkgZ3JvdXBpbmcgdGhlIGRhdGEgYnkgeWVhciwgdGhlbiB1c2VkIGNvdW50KCkgYW5kIHN1bW1hcml6ZSgpIHRvIGdldCB2YWx1ZXMgZm9yIHRoZSB0aHJlZSB2YXJpYWJsZXM6IG51bWJlciBvZiBjYXNlcywgdG90YWwgdmlvbGF0aW9ucywgYW5kIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMuU2luY2UgdGhlIHllYXIgd2l0aCB0aGUgbW9zdCBjYXNlcyB3YXMgZGlmZmVyZW50IGZyb20gdGhlIHllYXIgd2l0aCB0aGUgbW9zdCB2aW9sYXRpb25zIGFuZCBhZmZlY3RlZCBlbXBsb3llZXMsIEkgdXNlZCB0aGUgc2FtZSBjb2RlIGJ1dCBhcnJhbmdlZCB0aGUgcmVzdWx0cyBzZXBhcmF0ZWx54oCUZmlyc3QgYnkgY2FzZSBjb3VudCwgdGhlbiBieSB0b3RhbCB2aW9sYXRpb25z4oCUdG8gaWRlbnRpZnkgZWFjaCBoaWdoZXN0IHllYXIuCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UgKCBjb3VudCA9IG4oKSwgCiAgICAgICAgICAgICAgVG90YWxfVmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgICBUb3RhbF9hZmZlY3RlZF9lbXBsb3llZXMgPSBzdW0gKGVlX3Zpb2x0ZF9jbnQpKSAlPiUKICBhcnJhbmdlIChkZXNjIChjb3VudCkpCgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCAKICAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgIFRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKFRvdGFsX1Zpb2xhdGlvbikpCgpgYGAKClEyMjogSG93IGhhcyBNaXNzb3VyaSBiZWVuIGV4cGVyaWVuY2luZyBXYWdlICYgSG91ciBDb21wbGlhbmNlIGNhc2VzLCB2aW9sYXRpb25zLCBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzIG92ZXIgdGhlIGxhc3QgMTAgeWVhcnM/CiNBbnN3ZXI6IE1pc3NvdXJpIGhhcyBiZWVuIGV4cGVyaWVuY2luZyBhIGRlY2xpbmluZyB0cmVuZCBpbiBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9ucyBzaW5jZSAyMDIwLiBJbiB0aGF0IHllYXIsIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgd2FzIDMxOCwgd2hpY2ggZHJvcHBlZCBzaWduaWZpY2FudGx5IHRvICA2IGNhc2VzIGJ5IDIwMjQuIEZpdmUgeWVhcnMgYWdvLCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgd2FzIDMsNjYxLCBhbmQgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMgd2FzIDMsMDY2LiBJbiAyMDI0LCB0aGVzZSBudW1iZXJzIGRlY2xpbmVkIHRvIDg4IHZpb2xhdGlvbnMgYW5kIDYwIGFmZmVjdGVkIGVtcGxveWVlcywgcmVzcGVjdGl2ZWx5IAoKI1Byb2Nlc3M6IFRvIGFuYWx5emUgdGhlIGxhc3QgMTAgeWVhcnMsIEkgZmlsdGVyZWQgdGhlIGRhdGFzZXQgdXNpbmcgdGhlICVpbiUgb3BlcmF0b3IgYW5kIGxpc3RlZCBlYWNoIG9mIHRoZSBsYXN0IHRlbiB5ZWFycyBleHBsaWNpdGx5LiBBZnRlciBmaWx0ZXJpbmcsIEkgZm9sbG93ZWQgdGhlIHNhbWUgYXBwcm9hY2ggYXMgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uOiBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgeWVhciBhbmQgdGhlbiB1c2VkIGNvdW50KCkgYW5kIHN1bW1hcml6ZSgpIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNhc2VzLCB0b3RhbCB2aW9sYXRpb25zLCBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSBkYXRhIGluIGFzY2VuZGluZyBvcmRlciB0byBnZXQgeWVhci13aXNlIHRyZW5kcyBjbGVhcmx5LgpgYGB7cn0KCk1PX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKFllYXIgJWluJSBjKDIwMTUsIDIwMTYsIDIwMTcsIDIwMTgsIDIwMTksIDIwMjAsIDIwMjEsIDIwMjIsIDIwMjMsIDIwMjQpKSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpemUoY291bnQgPSBuKCksCiAgICB0b3RhbF92aW9sYXRpb24gPSBzdW0oY2FzZV92aW9sdG5fY250KSwgCiAgICBUb3RhbF9hZmZlY3RlZF9lbXBsb3llZXMgPSBzdW0gKGVlX3Zpb2x0ZF9jbnQpKSAlPiUKICBhcnJhbmdlIChZZWFyKQoKYGBgCgpRMjMuIFdoaWNoIGluZHVzdHJ5IGluIE1pc3NvdXJpIGV4cGVyaWVuY2VkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcywgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIGFuZCB0aGUgbW9zdCBhZmZlY3RlZCBlbXBsb3llZXMgYWNjb3JkaW5nIHRvIHRoZSBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBkYXRhPwojQW5zd2VyOiBGdWxsLVNlcnZpY2UgUmVzdGF1cmFudHMgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgbnVtYmVycyB3aXRoIDkxNSBjYXNlcywgMTUsNjY0IHRvdGFsIHZpb2xhdGlvbnMsIGFuZCAxMiw5NzkgYWZmZWN0ZWQgZW1wbG95ZWVzLiBJbiBmYWN0IHRvcCB0aHJlZSBpbmR1c3RyaWVzIG9mIHRoZSB0YWJsZSBhcmUgcmVsYXRlZCB0byBsYXVpc2VyIGFuZCBob3NwaXRhbGl0eSBidXNpbmVzczogRnVsbC1TZXJ2aWNlIFJlc3RhdXJhbnRzLCBMaW1pdGVkLVNlcnZpY2UgUmVzdGF1cmFudHMsIGFuZCBIb3RlbHMgKGV4Y2VwdCBDYXNpbm8gSG90ZWxzKSBhbmQgTW90ZWxzLiAgIAoKI1Byb2Nlc3M6IEZpcnN0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgaW5kdXN0cnkgKG5haWNzX2NvZGVfZGVzY3JpcHRpb24pLiBUbyBhbnN3ZXIgYWxsIHRocmVlIHBhcnRzIG9mIHRoZSBxdWVzdGlvbiB0b2dldGhlciwgSSB1c2VkIHRoZSBzdW1tYXJpemUoKSBmdW5jdGlvbjogRm9yIHRoZSBudW1iZXIgb2YgY2FzZXMsIEkgdXNlZCB0aGUgbigpIGZ1bmN0aW9uLiBTaW5jZSBlYWNoIHJvdyByZXByZXNlbnRzIGEgY2FzZSwgY291bnRpbmcgaG93IG1hbnkgdGltZXMgYSBpbmR1c3RyeSBuYW1lIGFwcGVhcnMgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcy4gRm9yIHRvdGFsIHZpb2xhdGlvbnMgYW5kIGFmZmVjdGVkIGVtcGxveWVlcywgSSB1c2VkIHRoZSBzdW0oKSBmdW5jdGlvbiBvbiB0aGUgcmVsZXZhbnQgY29sdW1ucy4gRmluYWxseSwgSSBhcnJhbmdlZCB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBudW1iZXIgb2YgY2FzZXMuIApgYGB7cn0KCk1PX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkoIGluZHVzdHJ5ID0gbmFpY3NfY29kZV9kZXNjcmlwdGlvbikgJT4lCiAgc3VtbWFyaXNlICggY291bnQgPSBuKCksIAogICAgICAgICAgICAgIHRvdGFsX3Zpb2xhdGlvbiA9IHN1bSAoY2FzZV92aW9sdG5fY250KSwgCiAgICAgICAgICAgICAgdG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzID0gc3VtIChlZV92aW9sdGRfY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAoY291bnQpKQoKYGBgCgpRMjQuIFdoaWNoIGluZGljYXRvcnMgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSBoYXZlIHRoZSBoaWdoZXN0IHRvdGFsIHZpb2xhdGlvbnMgaW4gTWlzc291cmk/IAojQW5zd2VyOiBTZXJ2aWNlX0NvbnRyYWN0X1Zpb2xhdGlvbjogNiwyMDguIGZvbGxvd2luZyBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb246IDIsNDU1LiAKCiNQcm9jZXNzOiBNaXNzb3VyaSBXYWdlICYgSG91ciBDb21wbGluY2UgZGF0YSBzZXQgaGFzIDc1IHZhcmlhYmxlLCBoYWxmIG9mIHRob3NlIGFyZSByZWxhdGUgdG8gdm9pbGF0aW9uIGNvdW50LiBBbW9uZyB0aGVtIDYgdmVyaWFibGUgYXJlIG1vc3QgaW1wb3RhbnQgdG8gZm9sbG93IGFjY29kaW5nIHRvIERlcGFydG1lbnQgb2YgTGFib3IuIEkgbWVzc3VyZWQgdGhvc2UgZm9yIG5hdGlvbmFsIGRhdGEgYXMgd2VsbC4gVGhvc2Ugc2l4IGluZGljYXRvcnMvdmVyaWFibGVzIGFyZTogIGZsc2FfdmlvbHRuX2NudCAoRmFpciBMYWJvciBTdGFuZGFyZHMgQWN0IHZpb2xhdGlvbnMpLCBtc3BhX3Zpb2x0bl9jbnQgKE1pZ3JhbnQgYW5kIFNlYXNvbmFsIEFncmljdWx0dXJhbCBXb3JrZXIgUHJvdGVjdGlvbiBBY3QgdmlvbGF0aW9ucyksIHNjYV92aW9sdG5fY250IChTZXJ2aWNlIENvbnRyYWN0IEFjdCB2aW9sYXRpb25zKSwgZm1sYV92aW9sdG5fY250IChGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgQWN0IHZpb2xhdGlvbnMpLCBoMWJfdmlvbHRuX2NudCAoSC0xQiB3b3JrIHZpc2EgdmlvbGF0aW9ucyksIGZsc2FfY2xfdmlvbHRuX2NudCAoQ2hpbGQgTGFib3IgdmlvbGF0aW9ucyB1bmRlciBGTFNBKS4gSSBzZWxlY3QgdGhvc2UgZm9yIHRvIHNob3cgdGhlbSBpbiBteSBhbmFseXNpcyBvbmx5LiBUaGVuLCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgdW5kZXIgZWFjaCBsYXcuIEkgcmVuYW1lZCB0aGUgb3V0cHV0IGNvbHVtbnMgZm9yIGNsYXJpdHksIHNvIGVhY2ggdG90YWwgcmVmbGVjdHMgdGhlIHJlc3BlY3RpdmUgdmlvbGF0aW9uIHR5cGUuIEhvd2V2ZXIsIHRoZSB3YXkgdGhlIHJlc3VsdHMgd2VyZSBkaXNwbGF5ZWQgdXNpbmcgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIG1hZGUgaXQgZGlmZmljdWx0IHRvIG1lYXN1cmUgb3IgYW5hbHl6ZSB0aGUgZGF0YSBjbGVhcmx5LiBUaGVyZWZvcmUsIEkgd2FudGVkIHRvIHJlc3RydWN0dXJlIHRoZSBvdXRwdXQgYnkgaGF2aW5nIGFsbCB2aW9sYXRpb24gdHlwZXMgbGlzdGVkIGluIG9uZSBjb2x1bW4gYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmlvbGF0aW9uIG51bWJlcnMgaW4gYW5vdGhlciBjb2x1bW4uIFRvIGFjaGlldmUgdGhpcywgSSB1c2VkIHRoZSBwaXZvdF9sb25nZXIoKSBmdW5jdGlvbi4gVGhlbiBhcnJhbmdlZCB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIGVhc2llciBjb21wYXJpc29uIGFuZCBhbmFseXNpcy4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogICAgc2VsZWN0KGZsc2FfdmlvbHRuX2NudCwgbXNwYV92aW9sdG5fY250LCAgc2NhX3Zpb2x0bl9jbnQsIAogICAgICAgICBmbWxhX3Zpb2x0bl9jbnQsIGgxYl92aW9sdG5fY250LCBmbHNhX2NsX3Zpb2x0bl9jbnQpICU+JQogIHN1bW1hcml6ZSAoRmFpcl9MYWJvcl9TdGFuZGFyZHNfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIE1pZ3JhbnRfQWdyaWN1bHR1cmFsX1Byb3RlY3Rpb25fVmlvbGF0aW9uID0gc3VtIChtc3BhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCksCiAgICAgICAgICAgICBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24gPSBzdW0gKGZtbGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgSW1taWdyYXRpb25fV29ya19WaXNhX1Zpb2xhdGlvbiA9IHN1bSAoaDFiX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZpb2xhdGlvbl9UeXBlIiwgdmFsdWVzX3RvID0gIlRvdGFsX0NvdW50IikgJT4lCiAgYXJyYW5nZShkZXNjKFRvdGFsX0NvdW50KSkKCmBgYAoKUTI1OiBIb3cgaGFzIHRoZSB2aW9sYXRpb24gbnVtYmVyIG9mIHRoZSA2IG1ham9yIGluZGljYXRvcnMgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSB2YXJpZWQgb3ZlciB0aGUgeWVhcnMgaW4gTWlzc291cmk/CiNBbnN3ZXI6IFRoZSByZXN1bHRzIHNob3cgdGhhdCBhbGwgc2l4IG1ham9yIGluZGljYXRvcnMgaGF2ZSBkZWNyZWFzZWQgc2lnbmlmaWNhbnRseSBvdmVyIHRoZSBwYXN0IHRlbiB5ZWFycyBpbiBNaXNzb3VyaS4gSG93ZXZlciwgc29tZSBvZiB0aGVtIGV4cGVyaWVuY2VkIGluY3JlYXNlcyBkdXJpbmcgdGhlIG1pZC15ZWFycy4gRm9yIGV4YW1wbGUsIGR1cmluZyB0aGUgcGFuZGVtaWMgaW4gMjAyMCBhbmQgMjAyMSwgRmFpciBMYWJvciBTdGFuZGFyZHMgVmlvbGF0aW9ucyByb3NlIHRvIDE0MCwgYnV0IGRyb3BwZWQgdG8gMyBieSAyMDI0LiBTZXJ2aWNlIENvbnRyYWN0IFZpb2xhdGlvbnMgZmVsbCBmcm9tIDM3NSBpbiAyMDE3IHRvIHplcm8gaW4gMjAyNC4gQ2hpbGQgTGFib3IgVmlvbGF0aW9ucyBhbHNvIGRlY2xpbmVkLCBmcm9tIDYwIGluIDIwMTUgdG8gIDMgaW4gMjAyNC4gCiAgCiNQcm9jZXNzOiBUbyBhbmFseXplIHllYXItd2lzZSBkYXRhIGZvciBlYWNoIGluZGljYXRvciwgSSBmaXJzdCBncm91cGVkIHRoZSBkYXRhc2V0IGJ5IHllYXIuIFNpbmNlIHRoZSBkYXRhc2V0IHNwYW5zIGEgbG9uZyBwZXJpb2QsIEkgZmlsdGVyZWQgaXQgdG8gb25seSBpbmNsdWRlIHRoZSBtb3N0IHJlY2VudCAxMCB5ZWFycyB1c2luZyB0aGUgJWluJSBvcGVyYXRvci4gVGhlbiwgSSB1c2VkIHRoZSBzYW1lIGNvZGUgc3RydWN0dXJlIGZyb20gdGhlIHByZXZpb3VzIHF1ZXN0aW9uIHRvIHN1bW1hcml6ZSB2aW9sYXRpb25zIGZvciBzaXggbWFqb3IgaW5kaWNhdG9ycy4gSSBhbHNvIGludGVuZGVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVnYXRpdmUgZ3Jvd3RoIHBlcmNlbnRhZ2Ugb3ZlciB0aGUgdGVuLXllYXIgc3BhbiB0byBzaG93IHRoZSByYXRlIG9mIGltcHJvdmVtZW50IGJ1dCB3YXMgdW5hYmxlIHRvIHdyaXRlIGEgY29kZSBpdCBzdWNjZXNzZnVsbHkuIEluc3RlYWQsIEkgc29ydGVkIHRoZSBzdW1tYXJpemVkIGRhdGEgYnkgeWVhciB0byBvYnNlcnZlIHRoZSB0cmVuZC4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0KSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc2VsZWN0KGZsc2FfdmlvbHRuX2NudCwgbXNwYV92aW9sdG5fY250LCAgc2NhX3Zpb2x0bl9jbnQsIAogICAgICAgICBmbWxhX3Zpb2x0bl9jbnQsIGgxYl92aW9sdG5fY250LCBmbHNhX2NsX3Zpb2x0bl9jbnQpICU+JQogIHN1bW1hcml6ZSAoRmFpcl9MYWJvcl9TdGFuZGFyZHNfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIE1pZ3JhbnRfQWdyaWN1bHR1cmFsX1Byb3RlY3Rpb25fVmlvbGF0aW9uID0gc3VtIChtc3BhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCksCiAgICAgICAgICAgICBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24gPSBzdW0gKGZtbGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgSW1taWdyYXRpb25fV29ya19WaW9sYXRpb24gPSBzdW0gKGgxYl92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBDaGlsZF9sYWJvcl9WaW9sYXRpb24gPSBzdW0gKGZsc2FfY2xfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKFllYXIpCgpgYGAKClEyNi4gSG93IGRpZCB0aGUgdG9wIGZpdmUgY2l0aWVzIGluIE1pc3NvdXJpIHdpdGggdGhlIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucyBvZiBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2Ugb3ZlciB0aGUgbGFzdCAxMCB5ZWFycyB2YXJ5PwojQW5zd2VyOiBBbW9uZyB0aGUgdG9wIGZpdmUgY2l0aWVzIGluIE1pc3NvdXJpIHRoYXQgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucywgU1BSSU5HRklFTEQsIENPTFVNQklBLCBJTkRFUEVOREVOQ0UgZGlkIG5vdCBoYXZlIGFueSB2aW9sYXRpb25zIG9mIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBpbiB0aGUgMjAyNC4gQWxsIGZpdmUgY2l0aWVzIGhhdmUgc2VlbiBkZWNyZWFzZXMgaW4gdG90YWwgdmlvbGF0aW9ucyBieSAyMDI0IGNvbXBhcmVkIHRvIDIwMTUuIEhvd2V2ZXIsIFNhaW50IExvdWlzIHJlY29yZGVkIGEgaGlnaGVyIG51bWJlciBvZiB2aW9sYXRpb25zIGluIDIwMjIgKDMxMikgdGhhbiBpbiB0aGUgcHJldmlvdXMgeWVhciAoMTYyKS4gQ29sdW1iaWEgZGVjbGluZWQgZnJvbSA1NTYgdmlvbGF0aW9ucyBpbiAyMDE1IHRvIHplcm8gZm9yIHRoZSBsYXN0IHR3byB5ZWFycy4gS2Fuc2FzIENpdHkgZXhwZXJpZW5jZWQgMiB2aW9sYXRpb25zIGluIDIwMjQsIGRvd24gZnJvbSA5NTcgaW4gMjAxNy4gU2FpbnQgTG91aXMgaGFkIHRoZSBoaWdoZXN0IHZpb2xhdGlvbnMgaW4gMjAxNywgd2l0aCAxLDMyNCwgYW5kIHJlbWFpbmVkIHRoZSB0b3AgY2l0eS4gSW5kZXBlbmRlbmNlIGFsc28gc2F3IHNwaWtlcyBpbiB2aW9sYXRpb25zLCByZWFjaGluZyAxLDYxMSBpbiAyMDE3LiBTcHJpbmdmaWVsZCBzaG93ZWQgY29uc2lzdGVudCBtaWQtdG8taGlnaCB2aW9sYXRpb25zLCB3aXRoIGEgcGVhayBpbiAyMDIwICg2NDEpLgoKI1Byb2Nlc3M6IFRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBJIGZpbHRlcmVkIHRoZSBkYXRhIGJ5IGJvdGggY2l0eSBhbmQgeWVhciwgYXMgSSBuZWVkZWQgaW5mb3JtYXRpb24gZm9yIGZpdmUgc3BlY2lmaWMgY2l0aWVzIG92ZXIgdGhlIGxhc3QgdGVuIHllYXJzLiBGcm9tIHRoZSBiZWdpbm5pbmcgb2YgbXkgY29kZSwgSSB1c2VkIHRoZSAlaW4lIG9wZXJhdG9yIHRvIHNlbGVjdCBvbmx5IHRoZSByZWxldmFudCB5ZWFycyBhbmQgY2l0aWVzLiBOZXh0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgYm90aCB5ZWFyIGFuZCBjaXR5LCBhcyBJIG5lZWRlZCB0aGUgdmlvbGF0aW9uIG51bWJlcnMgZm9yIGVhY2ggY2l0eSBhY3Jvc3MgZWFjaCB5ZWFyLiBBZnRlciBncm91cGluZywgSSBzdW1tYXJpemVkIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiB5ZWFyIGFuZCBjaXR5LiBGaW5hbGx5LCB0byBwcmVzZW50IHRoZSBkYXRhIGluIGEgdGFidWxhciBmb3JtYXQsIEkgdXNlZCB0aGUgcGl2b3Rfd2lkZXIoKSBmdW5jdGlvbiB0byByZXNoYXBlIHRoZSBkYXRh4oCUbWFraW5nIGVhY2ggY2l0eSBhIHNlcGFyYXRlIGNvbHVtbiB3aXRoIHllYXJzIGFzIHJvd3MuCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGZpbHRlcihjdHlfbm0gJWluJSBjKCJTQUlOVCBMT1VJUyIsICJLQU5TQVMgQ0lUWSIsICJTUFJJTkdGSUVMRCIsICJDT0xVTUJJQSIsICJJTkRFUEVOREVOQ0UiKSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgY3R5X25tKSAlPiUKICBzdW1tYXJpemUodG90YWxfdmlvbGF0aW9uID0gc3VtKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAiY3R5X25tIiwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSAidG90YWxfdmlvbGF0aW9uIikgCgpgYGAKClEyNy4gV2hpY2ggV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBjYXNlIGluIE1pc3NvdXJpIHRvb2sgdGhlIGxvbmdlc3QgdGltZSB0byBjb21wbGV0ZT8KI0Fuc3dlcjogVGhlIGNhc2UgbnVtYmVyIGlzIDEwMzU5NjcuIEl0IGlzIGFnYWluc3QgQmx1ZSBTcHJpbmdzIExhd24gJiBHYXJkZW4gZnJvbSBCbHVlIFNwcmluZ3MsIE1pc3NvdXJpLiBUaGlzIGNhc2UgdG9vayA0LDg0MCBkYXlzIHRvIGNvbXBsZXRlLCB3aGljaCBpcyBtb3JlIHRoYW4gMTMgeWVhcnMuIFRoZSBmaW5kaW5ncyBiZWdhbiBvbiBTZXB0ZW1iZXIgMjYsIDE5OTcsIGFuZCBlbmRlZCBvbiBEZWNlbWJlciAyNywgMjAxMC4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBjYWxsZWQgRGF5c190b19jb21wbGV0ZSwgd2hpY2ggSSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIGZpbmRpbmdzX3N0YXJ0X2RhdGUgZnJvbSBmaW5kaW5nc19lbmRfZGF0ZSB1c2luZyB0aGUgYXMubnVtZXJpYygpIGZ1bmN0aW9uLiBOZXh0LCBJIGZpbHRlcmVkIHRoZSBkYXRhIGJ5IHN0YXRlIGZvciBnZXQgb25seSBNTyBkYXRhLiBGaW5uYWx5IEkgYXJyYW5nZSB0aGUgZGF0YSBpbiBkZXNjZW5kaW5nIG9yZGVyIHRvIGZpbmQgdGhlIGFuc3dlci4gCmBgYHtyfQogCiAgVVNfd2FnZV90aGVmdCAlPiUKICBtdXRhdGUgKGZpbmRpbmdzX3N0YXJ0X2RhdGUgPSB5bWQgKGZpbmRpbmdzX3N0YXJ0X2RhdGUpLCAKICAgICAgICAgIGZpbmRpbmdzX2VuZF9kYXRlID0geW1kIChmaW5kaW5nc19lbmRfZGF0ZSksCiAgICAgICAgICBEYXlzX3RvX2NvbXBsZXRlID0gYXMubnVtZXJpYyAoZmluZGluZ3NfZW5kX2RhdGUgLSBmaW5kaW5nc19zdGFydF9kYXRlKSkgJT4lCiAgZmlsdGVyIChzdF9jZCA9PSAiTU8iKSAlPiUKICBhcnJhbmdlIChkZXNjKERheXNfdG9fY29tcGxldGUpKQoKYGBgCgpRMjguIFdoYXQgYXJlIHRoZSBhdmVyYWdlIGFuZCBtZWRpYW4gZGF5cyB0byBjb21wbGV0ZSBhIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gY2FzZSBpbiBNaXNzb3VyaT8KI0Fuc3dlcjogVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRheXMgdG8gY29tcGxldGUgYSBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBjYXNlIGluIE1pc3NvdXJpIGlzIDU4OSBkYXlzLCBhbmQgdGhlIG1lZGlhbiBpcyA3MjggZGF5cywgd2hpY2ggaXMgYWxtb3N0IHR3byB5ZWFycy4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBjYWxsZWQgRGF5c190b19jb21wbGV0ZSwgd2hpY2ggSSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIGZpbmRpbmdzX3N0YXJ0X2RhdGUgZnJvbSBmaW5kaW5nc19lbmRfZGF0ZSB1c2luZyB0aGUgYXMubnVtZXJpYygpIGZ1bmN0aW9uLiBOZXh0LHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBhbmQgbWVkaWFuIHZhbHVlcyBmb3IgdGhlIGRheXMgdG8gY29tcGxldGUsIEkgdXNlZCB0aGUgc3VtbWFyaXplIGZ1bmN0aW9uIGFuZCB3cm90ZSBjb2RlIHRvIGNvbXB1dGUgYm90aCB0aGUgbWVhbiAoYXZlcmFnZSkgYW5kIG1lZGlhbi4gSSBhbHNvIGFkZGVkIG5hLnJtID0gVFJVRSB0byBhdm9pZCB0aGUgTkEgdmFsdWVzIGluIHRoZSBjb2x1bW4uIFNpbmNlIHRoZSBjb2x1bW4gY29udGFpbmVkIGEgZmV3IE5BIHZhbHVlcywgdXNpbmcgbmEucm0gPSBUUlVFIGVuc3VyZWQgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2FzIGJhc2VkIG9ubHkgb24gdGhlIGF2YWlsYWJsZSBkYXRhOyBvdGhlcndpc2UsIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuIE5BLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgbXV0YXRlIChmaW5kaW5nc19zdGFydF9kYXRlID0geW1kIChmaW5kaW5nc19zdGFydF9kYXRlKSwgCiAgICAgICAgICBmaW5kaW5nc19lbmRfZGF0ZSA9IHltZCAoZmluZGluZ3NfZW5kX2RhdGUpLAogICAgICAgICAgRGF5c190b19jb21wbGV0ZSA9IGFzLm51bWVyaWMgKGZpbmRpbmdzX2VuZF9kYXRlIC0gZmluZGluZ3Nfc3RhcnRfZGF0ZSkpICU+JQogIGZpbHRlciAoc3RfY2QgPT0gIk1PIikgJT4lCiAgc3VtbWFyaXplKGF2ZXJhZ2VfZGF5cyA9IG1lYW4oRGF5c190b19jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIG1lZGlhbl9kYXlzID0gbWVkaWFuKERheXNfdG9fY29tcGxldGUsIG5hLnJtID0gVFJVRSkpCgpgYGAKClEyOS4gSW4gd2hpY2ggaW5kdXN0cnkgZG8gV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gY2FzZXMgdGFrZSB0aGUgbG9uZ2VzdCBtZWRpYW4gdGltZSB0byBjb21wbGV0ZT8gQW5kIGhvdyBoYXMgdGhlIHRpbWUgdG8gY29tcGxldGUgYSBjYXNlIGluIE1pc3NvdXJpIGNoYW5nZWQgaW4gdGhlIGxhc3QgMTAgeWVhcnM/CgojQW5zd2VyOiBUaGUgaW5kdXN0cnkgd2l0aCB0aGUgbG9uZ2VzdCBtZWRpYW4gdGltZSB0byBjb21wbGV0ZSBhIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGNhc2UgaXMgVGVjaG5pY2FsIGFuZCBUcmFkZSBTY2hvb2xzLiBJdCB0YWtlcyAzLDUyMSBkYXlz4oCUb3IgYWJvdXQgbmluZSBhbmQgYSBoYWxmIHllYXJz4oCUdG8gY2xvc2UgYSBjYXNlIGluIHRoaXMgaW5kdXN0cnkuIEluIE1pc3NvdXJpLCB0aGUgbWVkaWFuIG51bWJlciBvZiBkYXlzIHRvIGNvbXBsZXRlIGEgY2FzZSBoYXMgZHJvcHBlZCBzaWduaWZpY2FudGx5IG92ZXIgdGhlIGxhc3QgMTAgeWVhcnMuIEluIDIwMTUsIGl0IHdhcyA3MjkgZGF5cywgYnV0IGluIDIwMjQsIGl0IGNhbWUgZG93biB0byBqdXN0IDE0NiBkYXlzLgoKI1Byb2Nlc3M6IFRvIGZpbmQgdGhlIG1lZGlhbiBudW1iZXIgb2YgZGF5cyB0byBjb21wbGV0ZSBhIGNhc2UgYnkgaW5kdXN0cnksIEkgZ3JvdXBlZCB0aGUgZGF0YXNldCBieSB0aGUgbmFpY3NfY29kZV9kZXNjcmlwdGlvbiBjb2x1bW4sIHdoaWNoIHJlcHJlc2VudHMgaW5kdXN0cnkgbmFtZXMuIFRoZW4sIEkgdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZWRpYW4gb2YgdGhlIERheXNfdG9fY29tcGxldGUgdmFyaWFibGUuIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciB0byBpZGVudGlmeSB3aGljaCBpbmR1c3RyaWVzIHRha2UgdGhlIGxvbmdlc3QgdGltZS4gVG8gYW5hbHl6ZSBNaXNzb3VyaSdzIHRyZW5kIG92ZXIgdGhlIGxhc3QgMTAgeWVhcnMsIEkgZmlyc3QgZmlsdGVyZWQgdGhlIGRhdGFzZXQgZm9yIGNhc2VzIGluIE1pc3NvdXJpIGFuZCBmb3IgeWVhcnMgMjAxNSB0aHJvdWdoIDIwMjQuIFRoZW4sIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSB5ZWFyLCB1c2VkIHRoZSBzdW1tYXJpemUoKSBmdW5jdGlvbiBhZ2FpbiB0byBmaW5kIHRoZSBtZWRpYW4gY29tcGxldGlvbiB0aW1lIGVhY2ggeWVhciwgYW5kIHRyYWNrZWQgaG93IGl0IGNoYW5nZWQgb3ZlciB0aW1lLgpgYGB7cn0KCk1PX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkobmFpY3NfY29kZV9kZXNjcmlwdGlvbikgJT4lCiAgc3VtbWFyaXplKG1lZGlhbl9kYXlzID0gbWVkaWFuKERheXNfdG9fY29tcGxldGUpKSAlPiUKICBhcnJhbmdlKGRlc2MobWVkaWFuX2RheXMpKQoKTU9fd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcml6ZShtZWRpYW5fZGF5cyA9IG1lZGlhbihEYXlzX3RvX2NvbXBsZXRlKSkgJT4lCiAgYXJyYW5nZSAoWWVhcikKCmBgYAoKClEzMC4gV2hpY2ggZW1wbG95ZXIgaW4gTWlzc291cmkgdmlvbGF0ZWQgdGhlIHNlcnZpY2UgY29udHJhY3QgdGhlIG1vc3QsIGFuZCB3aGljaCBpbmR1c3RyeSB0b3BzIHRoZSBsaXN0IGZvciBzZXJ2aWNlIGNvbnRyYWN0IHZpb2xhdGlvbnM/CiNBbnN3ZXI6IFRoZSBlbXBsb3llciB0aGF0IHZpb2xhdGVkIHRoZSBzZXJ2aWNlIGNvbnRyYWN0IHRoZSBtb3N0IGluIE1pc3NvdXJpIGlzIEFiYm90dCBBbWJ1bGFuY2UsIHdpdGggYSB0b3RhbCBvZiAxLDA4MyB2aW9sYXRpb25zLiBJbmR1c3RyeS13aXNlLCBUYXggUHJlcGFyYXRpb24gU2VydmljZXMgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBzZXJ2aWNlIGNvbnRyYWN0IHZpb2xhdGlvbnMsIHRvdGFsaW5nIDkyMC4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGhhcyB0d28gcGFydHMsIHNvIEkgd3JvdGUgdHdvIHNlcGFyYXRlIHBpZWNlcyBvZiBjb2RlLiBIb3dldmVyLCBib3RoIGZvbGxvd2VkIGEgc2ltaWxhciBzdHJ1Y3R1cmUsIHdpdGggb25seSB0aGUgZ3JvdXBpbmcgdmFyaWFibGUgYmVpbmcgZGlmZmVyZW50LiBUbyBmaW5kIHRoZSBlbXBsb3llciBhbmQgdGhlIGluZHVzdHJ5IHdpdGggdGhlIGhpZ2hlc3Qgc2VydmljZSBjb250cmFjdCB2aW9sYXRpb25zLCBJIHVzZWQgdGhlIGdyb3VwX2J5KCkgZnVuY3Rpb24gdG8gZ3JvdXAgdGhlIGRhdGEgYWNjb3JkaW5nbHkuIFRoZW4sIEkgdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBzZXJ2aWNlIGNvbnRyYWN0IHZpb2xhdGlvbnMuIEZpbmFsbHksIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHNlcnZpY2UgY29udHJhY3QgdmlvbGF0aW9ucy4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MoU2VydmljZV9Db250cmFjdF9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MoU2VydmljZV9Db250cmFjdF9WaW9sYXRpb24pKQoKYGBgCgpRMzEuIFdoaWNoIGVtcGxveWVyIGluIE1pc3NvdXJpIHZpb2xhdGVkIHRoZSBGYWlyIExhYm9yIFN0YW5kYXJkcyB0aGUgbW9zdCwgYW5kIHdoaWNoIGluZHVzdHJ5IHRvcHMgdGhlIGxpc3QgZm9yIEZhaXIgTGFib3IgU3RhbmRhcmRzIHZpb2xhdGlvbnM/CiNBbnN3ZXI6IFRoZSBlbXBsb3llciB0aGF0IHZpb2xhdGVkIHRoZSBGYWlyIExhYm9yIFN0YW5kYXJkcyBBY3QgdGhlIG1vc3QgaW4gTWlzc291cmkgaXMgRG9nIERheXMgQmFyIGFuZCBHcmlsbCwgd2l0aCBhIHRvdGFsIG9mIDQxIHZpb2xhdGlvbnMuIEluZHVzdHJ5LXdpc2UsIEZ1bGwtU2VydmljZSBSZXN0YXVyYW50cyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIEZhaXIgTGFib3IgU3RhbmRhcmRzIHZpb2xhdGlvbnMsIHRvdGFsaW5nIDM3NS4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGhhcyB0d28gcGFydHMsIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG9uZS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBtYWluIHZhcmlhYmxlIHRoaXMgdGltZSBpcyBGYWlyIExhYm9yIFN0YW5kYXJkcy4gSSBzdW1tYXJpemVkIHRoZSBkYXRhIGluIGJvdGggcGllY2VzIG9mIGNvZGUgYnkgZ3JvdXBpbmcgZmlyc3QgYnkgZW1wbG95ZXIgYW5kIHRoZW4gYnkgaW5kdXN0cnkgbmFtZS4gRmluYWxseSwgSSBhcnJhbmdlZCB0aGUgcmVzdWx0cyBieSB0aGUgRmFpciBMYWJvciBTdGFuZGFyZHMgdmlvbGF0aW9uIGNvdW50IGluIGRlY2VuZGluZyBvcmRlci4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYWlyX0xhYm9yX1N0YW5kYXJkc19WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYWlyX0xhYm9yX1N0YW5kYXJkc19WaW9sYXRpb24pKQoKYGBgCgpRMzIuIFdoaWNoIGVtcGxveWVyIGluIE1pc3NvdXJpIHZpb2xhdGVkIHRoZSBGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgQWN0IHRoZSBtb3N0LCBhbmQgd2hpY2ggaW5kdXN0cnkgdG9wcyB0aGUgbGlzdCBmb3IgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB2aW9sYXRpb25zPwojQW5zd2VyOiBUaGUgZW1wbG95ZXIgdGhhdCB2aW9sYXRlZCB0aGUgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB0aGUgbW9zdCBpbiBNaXNzb3VyaSBpcyBXZXN0IENvdW50eSBDYXJlIENlbnRlciwgd2l0aCBhIHRvdGFsIG9mIDEsMzgwIHZpb2xhdGlvbnMuIEluZHVzdHJ5LXdpc2UsIE51cnNpbmcgQ2FyZSBGYWNpbGl0aWVzIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB2aW9sYXRpb25zLCB0b3RhbGluZyAxLDQyMS4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIHR3by4gVGhlcmVmb3JlLCBJIGZvbGxvd2VkIGFsbW9zdCB0aGUgc2FtZSBwcm9jZXNzIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCB3aXRoIHRoZSBvbmx5IGNoYW5nZSBiZWluZyB0aGUgdmFyaWFibGUgcmVsYXRlZCB0byB0aGUgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdC4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKEZhbWlseV9NZWRpY2FsX0xlYXZlX1Zpb2xhdGlvbiA9IHN1bSAoZm1sYV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKEZhbWlseV9NZWRpY2FsX0xlYXZlX1Zpb2xhdGlvbiA9IHN1bSAoZm1sYV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24pKQoKYGBgCgoKUTMzLiBXaGljaCBlbXBsb3llciBpbiBNaXNzb3VyaSB2aW9sYXRlZCB0aGUgQ2hpbGQgTGFib3IgQWN0IHRoZSBtb3N0LCBhbmQgd2hpY2ggaW5kdXN0cnkgYW5kIGNpdHkgdG9wIHRoZSBsaXN0IGZvciBDaGlsZCBMYWJvciBBY3QgdmlvbGF0aW9ucz8KI0Fuc3dlcjogVGhlIGVtcGxveWVyIHRoYXQgdmlvbGF0ZWQgdGhlIENoaWxkIExhYm9yIEFjdCB0aGUgbW9zdCBpbiBNaXNzb3VyaSBpcyBEb2cgRGF5cyBCYXIgYW5kIEdyaWxsLCB3aXRoIGEgdG90YWwgb2YgNDEgdmlvbGF0aW9ucy4gSW5kdXN0cnktd2lzZSwgRnVsbC1TZXJ2aWNlIFJlc3RhdXJhbnRzIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgQ2hpbGQgTGFib3IgQWN0IHZpb2xhdGlvbnMsIHRvdGFsaW5nIDM3NS4gVGhlIGNpdHkgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgQ2hpbGQgTGFib3IgQWN0IHZpb2xhdGlvbnMgaXMgU1BSSU5HRklFTEQsIHdpdGggMTMzIGluY2lkZW50cy4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIHRocmVlLCBidXQgdGhpcyB0aW1lIEkgYWxzbyBpbmNsdWRlZCBjaXR5IGFzIGFuIGFkZGl0aW9uYWwgZmFjdG9yIHRvIGlkZW50aWZ5IHdoaWNoIGNpdHkgaW4gTWlzc291cmkgZXhwZXJpZW5jZWQgdGhlIG1vc3QgQ2hpbGQgTGFib3IgdmlvbGF0aW9ucy4gVG8gYW5zd2VyIGFsbCB0aHJlZSBwYXJ0cyBvZiB0aGUgcXVlc3Rpb24sIEkgZm9sbG93ZWQgdGhlIHNhbWUgZ2VuZXJhbCBwcm9jZXNz4oCUZ3JvdXBpbmcgdGhlIGRhdGEgYnkgZW1wbG95ZXIsIGluZHVzdHJ5LCBhbmQgY2l0eeKAlHRoZW4gc3VtbWFyaXppbmcgdGhlIHRvdGFsIG51bWJlciBvZiBDaGlsZCBMYWJvciB2aW9sYXRpb25zLiBUaGUgb25seSBjaGFuZ2Ugd2FzIHVzaW5nIHRoZSB2YXJpYWJsZSByZWxhdGVkIHRvIENoaWxkX2xhYm9yX1Zpb2xhdGlvbi4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhDaGlsZF9sYWJvcl9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhDaGlsZF9sYWJvcl9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShjdHlfbm0pICU+JQogIHN1bW1hcml6ZSAoQ2hpbGRfbGFib3JfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpKSAlPiUKICBhcnJhbmdlIChkZXNjKENoaWxkX2xhYm9yX1Zpb2xhdGlvbikpCgpgYGAKClEzNC4gV2hpY2ggZW1wbG95ZXIvYnVzaW5lc3MgaW4gTWlzc291cmkgdmlvbGF0ZWQgYWxsIHNpeCBtYWpvciBpbmRpY2F0b3JzIG9mIFdhZ2UgYW5kIEhvdXJzIENvbXBsaWFuY2U/CiNBbnN3ZXI6IE5vbmUuCgojUHJvY2VzczogVG8gZ2V0IHRoZSBhbnN3ZXIsIEkgdXNlZCB0aGUgZmlsdGVyIGZ1bmN0aW9uLiBBcyBJIG5lZWRlZCB0byBmaW5kIHRyYWRlIG5hbWVzIG9mIGJ1c2luZXNzZXMgdGhhdCBoYWQgdmlvbGF0aW9ucyBpbiBhbGwgc2l4IGNhdGVnb3JpZXMsIEkgZmlsdGVyZWQgZm9yIHJvd3MgdGhhdCBoYWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvIGluIGFsbCBzaXggY29sdW1ucyAoc2luY2UgemVybyBtZWFucyBubyB2aW9sYXRpb24pLiBJIHdhbnRlZCB0byBzZWUgaWYgYW55IGNvbXBhbnkgaGFkIHZpb2xhdGlvbnMgaW4gYWxsIHNpeCBjYXRlZ29yaWVzLCB3aGljaCBpcyB3aHkgSSBmaWx0ZXJlZCB1c2luZyA+MCBmb3IgZWFjaCB2YXJpYWJsZS4gRmluYWxseSwgSSBzZWxlY3RlZCB0aGUgdHJhZGVfbm0gY29sdW1uIHNvIHRoYXQgaWYgYW55IGVtcGxveWVyIGhhZCB2aW9sYXRpb25zIGluIGFsbCBzaXggY2F0ZWdvcmllcywgdGhlaXIgdHJhZGUgbmFtZSB3b3VsZCBhcHBlYXIuICAgCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoZmxzYV92aW9sdG5fY250ID4gMCwKICAgIG1zcGFfdmlvbHRuX2NudCA+IDAsCiAgICBzY2FfdmlvbHRuX2NudCA+IDAsCiAgICBmbWxhX3Zpb2x0bl9jbnQgPiAwLAogICAgaDFiX3Zpb2x0bl9jbnQgPiAwLAogICAgZmxzYV9jbF92aW9sdG5fY250ID4gMCkgJT4lCiAgc2VsZWN0KHRyYWRlX25tKQoKYGBgCgo=